diff --git a/.gitignore b/.gitignore index e85afafaa4d4fd462dbcb2170954ae5b9f1b94f7..9f164fb8989da35f962830904a11fc11479de4fa 100644 --- a/.gitignore +++ b/.gitignore @@ -134,4 +134,5 @@ dmypy.json # Custom paths results/ tmp*.txt -src/Configs/tests/ \ No newline at end of file +src/Configs/tests/ +.vscode/ \ No newline at end of file diff --git a/Help Client/help_server.py b/Help Client/help_server.py index 5fb25bb1735151e090cd878d7e27e8036ba424a0..fbf927118c1bb304114793b8bc7565e7a1be512f 100644 --- a/Help Client/help_server.py +++ b/Help Client/help_server.py @@ -15,7 +15,7 @@ WAIT_TIME_SECONDS = 60 TIMEOUT = 0.75 tl = Timeloop() -server = None +SERVER = None def request(unused_addr, opt_args): @@ -28,7 +28,7 @@ def request(unused_addr, opt_args): opt_args : str or list[str] optional arguments """ - print(Back.YELLOW+"Help requested.") + print(Back.YELLOW + "Help requested.") def page(unused_addr, opt_args): @@ -41,7 +41,7 @@ def page(unused_addr, opt_args): opt_args : str or list[str] optional arguments, here page number """ - print("Page {}".format(opt_args)) + print(f'Page {opt_args}') def connection(unused_addr, opt_args): @@ -54,7 +54,7 @@ def connection(unused_addr, opt_args): opt_args : str or list[str] optional arguments """ - print(Back.RED+"Connection to pupil capture lost.") + print(Back.RED + "Connection to pupil capture lost.") def finished(unused_addr, opt_args): @@ -67,7 +67,7 @@ def finished(unused_addr, opt_args): opt_args : str or list[str] optional arguments """ - print(Back.GREEN+"Questionnaire finished.") + print(Back.GREEN + "Questionnaire finished.") tl.stop() # server.server_close() # close the window manually, as this statement will throw exceptions @@ -76,10 +76,10 @@ def finished(unused_addr, opt_args): def send_ping(): """Send a ping to the GUI's machine.""" # noinspection PyTypeChecker - print("Pinging {} every {} seconds with timeout {}.".format(HOST, WAIT_TIME_SECONDS, TIMEOUT)) + print(f'Pinging {HOST} every {WAIT_TIME_SECONDS} seconds with timeout {TIMEOUT}.') response = ping(HOST, timeout=TIMEOUT) if response is None: - print(Back.RED+"Connection to GUI lost.") + print(Back.RED + "Connection to GUI lost.") else: print("Everything is fine :)") @@ -89,16 +89,14 @@ if __name__ == "__main__": own_ip = socket.gethostbyname(socket.gethostname()) parser = argparse.ArgumentParser() parser.add_argument("--port", type=int, default=5005, help="The port to listen on.") - parser.add_argument("--ping_ip", type=str, default=HOST, - help="IP of the GUI to ping to.") # TODO testen - parser.add_argument("--ping_timeout", type=float, default=TIMEOUT, - help="Timeout for ping back of GUI.") # TODO testen + parser.add_argument("--ping_ip", type=str, default=HOST, help="IP of the GUI to ping to.") # TODO testen + parser.add_argument("--ping_timeout", type=float, default=TIMEOUT, help="Timeout for ping back of GUI.") # TODO testen args = parser.parse_args() if args.ping_ip is not None: HOST = args.ping_ip if args.ping_timeout is not None: TIMEOUT = args.ping_timeout - print("Pinging {} every {} seconds with timeout {}.".format(HOST, WAIT_TIME_SECONDS, TIMEOUT)) + print(f'Pinging {HOST} every {WAIT_TIME_SECONDS} seconds with timeout {TIMEOUT}.') tl.start(block=False) dispatcher = dispatcher.Dispatcher() @@ -111,6 +109,6 @@ if __name__ == "__main__": # noinspection PyTypeChecker dispatcher.map("/questionnaire_finished", finished) - server = osc_server.ThreadingOSCUDPServer((own_ip, args.port), dispatcher) - print("Serving on {}".format(server.server_address)) - server.serve_forever() + SERVER = osc_server.ThreadingOSCUDPServer((own_ip, args.port), dispatcher) + print(f'Serving on {SERVER.server_address}') + SERVER.serve_forever() diff --git a/README.md b/README.md index d35f00e93c54c4f2db602708ad6b4f479005e8ca..450dbec2d0d2ffb3a1988acd583d3dd03942a915 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ The necessary python libraries are given in ```requirements.txt```. * [fpdf](https://pyfpdf.readthedocs.io/en/latest/) - Generate pdf file * [msgpack_python](https://pypi.org/project/msgpack/) - Communication * [ping3](https://github.com/kyan001/ping3) - Connection check -* [PyQt5](https://pypi.org/project/PyQt5/) - GUI +* [PySide6](https://pypi.org/project/PySide6/) - GUI * [python_osc](https://github.com/attwad/python-osc) - OSC communication * [pyzmq](https://docs.pupil-labs.com/developer/core/network-api/#pupil-remote) - Communication * [timeloop](https://github.com/sankalpjonn/timeloop) - Repeating jobs diff --git a/Tools/SignalGenerator.py b/Tools/SignalGenerator.py index dc67d530627b81c79f5e9f097822d1e4077d24e7..8e468420be4f5f2c5cf050f8d94401ada7a3edd9 100644 --- a/Tools/SignalGenerator.py +++ b/Tools/SignalGenerator.py @@ -6,7 +6,7 @@ import soundfile as sf import numpy as np -def write_audio_with_pattern(filepath, pattern, break_duration=10, subtype="PCM_16", amplitude=0.5, fs=44100, sine_duration=500, f=0, channels=1): +def write_audio_with_pattern(filepath, pattern, break_duration, subtype, amplitude, sine_duration, f, channels, fs=44100): """Write a sine pattern to use with the NTI.""" # Set values to NeXus Trigger Interface bounds, if necessary if f < 100: @@ -15,11 +15,11 @@ def write_audio_with_pattern(filepath, pattern, break_duration=10, subtype="PCM_ f = 20000 if break_duration < 10: break_duration = 10 - filename = ''.join(str(bit) for bit in pattern)+"_{}Hz_{}ms_sine_{}ms_break.wav".format(f, sine_duration, break_duration) + filename = ''.join(str(bit) for bit in pattern) + f'_{f}Hz_{sine_duration}ms_sine_{break_duration}ms_break.wav' - sine = (amplitude * np.sin(2 * np.pi * np.arange(fs * (sine_duration/1000)) * f / fs)).astype(np.float32) - silent_break = 0 * np.arange(fs * (break_duration/1000)) - silent_sine = 0 * np.arange(fs * (sine_duration/1000)) + sine = (amplitude * np.sin(2 * np.pi * np.arange(fs * (sine_duration / 1000)) * f / fs)).astype(np.float32) + silent_break = 0 * np.arange(fs * (break_duration / 1000)) + silent_sine = 0 * np.arange(fs * (sine_duration / 1000)) final_signal = [] final_signal.extend(silent_break) @@ -37,18 +37,18 @@ def write_audio_with_pattern(filepath, pattern, break_duration=10, subtype="PCM_ multichannel[:, ch] = final_signal final_signal = multichannel - sf.write(filepath+filename, final_signal, fs, subtype=subtype) + sf.write(f'{filepath}{filename}', final_signal, fs, subtype=subtype) if __name__ == '__main__': - pattern = [0] - destination = "./" - frequency = 440 - sine_duration = 50 - break_duration = 50 - amplitude = 0.5 - channels = 1 - subtype = "PCM_16" + PATTERN = [0] + DESTINATION = "./" + FREQUENCY = 440 + SINE_DURATION = 50 + BREAK_DURATION = 50 + AMPLITUDE = 0.5 + CHANNELS = 1 + SUBTYPE = "PCM_16" argv = sys.argv[1:] try: opts, args = getopt.getopt(argv, "hp:d:f:s:b:a:c:", ["pattern=", "destination=", "frequency=", "sine_duration=", "break_duration=", "amplitude=", "channels="]) @@ -60,20 +60,20 @@ if __name__ == '__main__': print() sys.exit('SignalGenerator.py -p <pattern> [-d <path_to_save_destination> -f <frequency> -s <sine_duration> -b <break_duration> -a <amplitude> -c <number_of_channels>]') elif opt in ("-p", "--pattern"): - pattern = list(arg) - for p in range(len(pattern)): - pattern[p] = int(pattern[p]) - print(pattern, type(pattern[0])) + PATTERN = list(arg) + for _, p in enumerate(PATTERN): + p = int(p) + print(PATTERN, type(PATTERN[0])) elif opt in ("-d", "--destination"): - destination = arg + DESTINATION = arg elif opt in ("-f", "--frequency"): - destination = arg + FREQUENCY = arg elif opt in ("-s", "--sine_duration"): - destination = arg + SINE_DURATION = arg elif opt in ("-b", "--break_duration"): - destination = arg + BREAK_DURATION = arg elif opt in ("-a", "--amplitude"): - destination = arg + AMPLITUDE = arg elif opt in ("-c", "--channels"): - destination = arg - write_audio_with_pattern(destination, pattern, break_duration=break_duration, amplitude=amplitude, sine_duration=sine_duration, f=frequency, channels=channels) + CHANNELS = arg + write_audio_with_pattern(DESTINATION, PATTERN, break_duration=BREAK_DURATION, amplitude=AMPLITUDE, sine_duration=SINE_DURATION, f=FREQUENCY, channels=CHANNELS, subtype=SUBTYPE) diff --git a/Tools/vlc_server.py b/Tools/vlc_server.py index 7e1c95ede8c5bfbd56bcc343cb0efe30cd326741..23b88d2b887106cbd2355b39cebbe4a3c288863d 100644 --- a/Tools/vlc_server.py +++ b/Tools/vlc_server.py @@ -20,7 +20,7 @@ def vlc_start(unused_addr, args): args : str or any if str: path of file to play """ - if args == '{}': + if args == "{}": pl.resume() print("status: resume") else: @@ -28,34 +28,34 @@ def vlc_start(unused_addr, args): print("status: play") -def vlc_stop(unused_addr, args): +def vlc_stop(unused_addr, unused_args): """ Stop the video in the current player (by pausing it). Parameters ---------- unused_addr : any - args : any + unused_args : any """ pl.pause() print("status: pause") -def vlc_finish(unused_addr, args): +def vlc_finish(unused_addr, unused_args): """ Set an all black still image, e.g. when currently no video needs to be played. Parameters ---------- unused_addr : any - args : any + unused_args : any """ video_thread = Thread(target=pl.play, args=("./Examples/black_3screens.mp4",)) video_thread.run() print("status: finish") -def vlc_still(unused_addr, args): +def vlc_still(unused_addr, unused_args): """ Set an all blue still image. Example use: Signal that the questionnaire is done. @@ -63,7 +63,7 @@ def vlc_still(unused_addr, args): Parameters ---------- unused_addr : any - args : any + unused_args : any """ video_thread = Thread(target=pl.play, args=("./Examples/blue_3screens.mp4",)) video_thread.run() @@ -76,9 +76,9 @@ if __name__ == "__main__": parser.add_argument("--reaper", type=bool, default=True, help="Flag to use Reaper (default: True).") parser.add_argument("--reaper_ip", default="127.0.0.1", help="IPv4 the computer hosting Reaper.") parser.add_argument("--reaper_port", type=int, default=8000, help="The port of Reaper.") - args = parser.parse_args() + arguments = parser.parse_args() - pl = Player(reaper=args.reaper, reaper_ip=args.reaper_ip, reaper_port=args.reaper_port) + pl = Player(reaper=arguments.reaper, reaper_ip=arguments.reaper_ip, reaper_port=arguments.reaper_port) vlc_still("", None) dispatcher = dispatcher.Dispatcher() @@ -89,6 +89,6 @@ if __name__ == "__main__": dispatcher.map("/vlc_still", vlc_still) # show a still image ip = socket.gethostbyname(socket.gethostname()) - server = osc_server.ThreadingOSCUDPServer((ip, args.port), dispatcher) - print("Serving on {}".format(server.server_address)) + server = osc_server.ThreadingOSCUDPServer((ip, arguments.port), dispatcher) + print(f'Serving on {server.server_address}') server.serve_forever() diff --git a/requirements.txt b/requirements.txt index 0a2e2f33c49b01c8ee66a65e42c55d8c6a49baef..d312c73e18c99625d059748650156afda07ac82d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ python_osc==1.7.7 configobj==5.0.6 fpdf==1.7.2 msgpack_python==0.5.6 -PyQt5~=5.15.4 +PySide6~=5.15.4 pyzmq~=22.3.0 timeloop~=1.0.2 python-osc~=1.7.7 @@ -15,4 +15,5 @@ keyboard~=0.13.5 portalocker~=2.5.1 psutil~=5.9.0 setuptools~=59.1.1 -colorama~=0.4.4 \ No newline at end of file +colorama~=0.4.4 +shiboken6 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 24e03f70d6eed201bc10341cd76fae2816ec75ec..6344dc640bf171e5fade639424988994d940a44b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,4 +5,10 @@ omit = ReaperScripts/*, src/Configs/*, src/Images/*, src/results/*, src/styleshe [coverage:report] show_missing = True skip_covered = True -exclude_lines = @pytest.mark.pupil \ No newline at end of file +exclude_lines = @pytest.mark.pupil + +[flake8] +ignore = E501, E128 + +[pylint] +disable = C0301, C0103, E0611 \ No newline at end of file diff --git a/setup.py b/setup.py index 7f411293d28b779c2a483998f7369fab5e8273a9..ccbfb8ab5f290d3fd04ad4ebf1b86bf59faf5023 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ with open("README.md", 'r') as f: setup( name='QUEST', - version='1.0.0', + version='1.1.0', description='An easy solution to create graphical user interfaces for offline questionnaires without programming knowledge.', license="GNU GPLv3", long_description=long_description, @@ -35,7 +35,7 @@ setup( # 'configobj', # 'fpdf', # 'msgpack_python', - # 'PyQt5', + # 'PySide6', # 'pyzmq', # 'timeloop', # ], diff --git a/src/ABX.py b/src/ABX.py index 48997bfede4d6561b29232d0966dfc4ba307b4ab..24d06dec44fd998854646166da60929cd6bf1ca8 100644 --- a/src/ABX.py +++ b/src/ABX.py @@ -2,7 +2,7 @@ from random import shuffle -from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QFormLayout, QLabel +from PySide6.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QFormLayout, QLabel from src.AnswerRadioButton import make_answers as radio from src.Player import Player @@ -50,19 +50,19 @@ class ABX(QWidget): else: self.name = None stimuli = [] - for cue_no in range(len(start_cues)): - stimuli.append((int(start_cues[cue_no]), tracks[cue_no])) + for cue_no, cue in enumerate(start_cues): + stimuli.append((int(cue), tracks[cue_no])) shuffle(stimuli) self.page = parent - self.a_button = Player(stimuli[0][0], [stimuli[0][1]], parent=self.page, qid=qid + "_A", displayed_buttons=["Play"], + self.a_button = Player(stimuli[0][0], [stimuli[0][1]], parent=self.page, qid=f'{qid}_A', displayed_buttons=["Play"], objectname=objectname, play_button_text=button_texts[0]) player_layout.addWidget(self.a_button) - self.b_button = Player(stimuli[1][0], [stimuli[1][1]], parent=self.page, qid=qid + "_B", displayed_buttons=["Play"], + self.b_button = Player(stimuli[1][0], [stimuli[1][1]], parent=self.page, qid=f'{qid}_B', displayed_buttons=["Play"], objectname=objectname, play_button_text=button_texts[1]) player_layout.addWidget(self.b_button) if x: - self.x_button = Player(int(start_cues[0]), [tracks[0]], parent=self.page, qid=qid + "_X", displayed_buttons=["Play"], + self.x_button = Player(int(start_cues[0]), [tracks[0]], parent=self.page, qid=f'{qid}_X', displayed_buttons=["Play"], objectname=objectname, play_button_text=button_texts[2]) player_layout.addWidget(self.x_button) else: diff --git a/src/AnswerCheckBox.py b/src/AnswerCheckBox.py index 695067e58e86c83ee8dfa6ba527b9f52a8cd1760..3d1bff33f215ec86eab872c1cdecd8b898219b8c 100644 --- a/src/AnswerCheckBox.py +++ b/src/AnswerCheckBox.py @@ -1,10 +1,11 @@ """ This class creates a set of checkboxes. """ -from PyQt5.QtWidgets import QHBoxLayout, QCheckBox +import datetime +from PySide6.QtWidgets import QHBoxLayout, QCheckBox -def make_answers(answer, objectname=None): +def make_answers(answer, qid, objectname=None, parent=None): """ Create a set of checkboxes based on the given array of answers. @@ -12,8 +13,12 @@ def make_answers(answer, objectname=None): ---------- answer : str or list[str] answer possibilities + qid : str + id of the question objectname : str, optional - name of the object, if it is supposed to be styled individually + name of the object, if it is supposed to be styled individually + parent : QObject + the page the question is on Returns ------- @@ -24,13 +29,36 @@ def make_answers(answer, objectname=None): """ hbox = QHBoxLayout() list_of_cb = [] - if type(answer) is str: + if isinstance(answer, str): answer = [answer] # to support questions with just one answer - for a in range(0, len(answer)): - cb = QCheckBox() + for a, answ in enumerate(answer): + cb = CheckBox(f'{qid}_{a}', parent) if objectname is not None: cb.setObjectName(objectname) - cb.setText(answer[a] + " ") + cb.setText(f'{answ} ') list_of_cb.append(cb) hbox.addWidget(cb) return hbox, list_of_cb + + +class CheckBox(QCheckBox): + """Create a CheckBox with own ID""" + def __init__(self, cid, parent=None): + """Create a CheckBox with own ID + + Parameters + ---------- + cid : str + unique id of the CheckBox + parent : QObject + the page the question is on + """ + QCheckBox.__init__(self, parent=parent) + self.id = cid + self.page = parent + self.toggled.connect(self.log) + + def log(self): + """Create a log entry.""" + # print(f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Toggled {self.id} to {self.isChecked()}') + self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Toggled {self.id} to {self.isChecked()}' diff --git a/src/AnswerRadioButton.py b/src/AnswerRadioButton.py index f99af704a41423eb9d9a01a77e9eda48538c2a2e..cff85f60032fbeb74abbd3de40d0722bcee946a3 100644 --- a/src/AnswerRadioButton.py +++ b/src/AnswerRadioButton.py @@ -1,7 +1,7 @@ """ This class creates a set of radiobuttons. """ -from PyQt5.QtWidgets import QHBoxLayout, QRadioButton, QButtonGroup +from PySide6.QtWidgets import QHBoxLayout, QRadioButton, QButtonGroup def make_answers(answer, parent, qid, objectname=None, start_answer_id=0, log=True): @@ -33,10 +33,10 @@ def make_answers(answer, parent, qid, objectname=None, start_answer_id=0, log=Tr hbox = QHBoxLayout() bg = QButtonGroup(hbox) cnt = start_answer_id - if type(answer) is str: + if isinstance(answer, str): answer = [answer] # to support questions with just one answer - for a in range(0, len(answer)): - rb = QRadioButton(answer[a]) + for a, answ in enumerate(answer): + rb = QRadioButton(answ) if objectname is not None: rb.setObjectName(objectname) if not log and a == 0: @@ -47,7 +47,7 @@ def make_answers(answer, parent, qid, objectname=None, start_answer_id=0, log=Tr bg.addButton(rb, cnt) cnt += 1 if log: - bg.buttonClicked.connect(lambda: parent.log(qid)) + bg.buttonClicked.connect(lambda: parent.log(qid, bg)) else: # for RadioMatrix - bg.buttonClicked.connect(lambda: parent.parent().log(qid)) + bg.buttonClicked.connect(lambda: parent.parent().log(qid, bg)) return hbox, bg diff --git a/src/AnswerSlider.py b/src/AnswerSlider.py index 60db94be9c3f1d25abbbbe645b2d4f44e095ecd7..f533ddccd7301442c8c1f4b53e1d33330708d252 100644 --- a/src/AnswerSlider.py +++ b/src/AnswerSlider.py @@ -1,31 +1,33 @@ """ This class creates a Slider. """ -from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import QVBoxLayout, QHBoxLayout, QLabel, QWidget +from PySide6.QtCore import Qt +from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QLabel, QWidget from src.LabeledSlider import LabeledSlider from src.Slider import Slider -def make_answers(labelled, qid, smin, smax, sstart=0, sstep=1, header=None, label=None, parent=None, objectname=""): +def make_answers(labelled, qid, smin, smax, sstart=0, sstep=1, tiv=1, header=None, label=None, parent=None, objectname=""): """ Create a slider based on the given parameters. Parameters - ---------- + ----------< labelled : bool if True each tick gets a numerical label; if False no tick labels are used. qid : str id of the question smin : int - lowest tick value + the lowest tick value smax : int - highest tick value + the highest tick value sstart : int, default=0 starting position of handle (if <smin, smin is chosen, if >smax, smax is chosen) sstep : int, default=1 difference between two successive values + tiv : int, default=1 + difference between two successive tick labels header : list[str], optional array of strings to put above the slider label : list[str] @@ -43,27 +45,28 @@ def make_answers(labelled, qid, smin, smax, sstart=0, sstep=1, header=None, labe the slider object itself """ if labelled: - slider = LabeledSlider(minimum=smin, maximum=smax, start=sstart, step=sstep, labels=label, parent=parent, objectname=objectname) - slider.sl.valueChanged.connect(lambda: parent.log(qid)) + tiv = sstep # TODO integrieren + slider = LabeledSlider(minimum=smin, maximum=smax, start=sstart, step=sstep, tick_interval=tiv, labels=label, parent=parent, objectname=objectname) + slider.sl.valueChanged.connect(lambda: parent.log(qid, slider)) else: - slider = Slider(Qt.Horizontal, parent=parent) + slider = Slider(Qt.Orientation.Horizontal, parent=parent) if objectname != "": slider.setObjectName(objectname) - slider.prepare_slider(min_val=smin, max_val=smax, start=sstart, step=sstep) - slider.valueChanged.connect(lambda: parent.log(qid)) + slider.prepare_slider(min_val=smin, max_val=smax, start=sstart, step=sstep, sid=qid) + slider.valueChanged.connect(lambda: parent.log(qid, slider)) if header is not None: layout = QVBoxLayout() header_layout = QHBoxLayout() - for h in range(0, len(header)-1): + for h in range(0, len(header) - 1): lbl = QLabel() lbl.setText(header[h]) - lbl.setAlignment(Qt.AlignHCenter) + lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter) lbl.setObjectName("SliderHeader") header_layout.addWidget(lbl) header_layout.addStretch() lbl = QLabel() lbl.setText(header[-1]) - lbl.setAlignment(Qt.AlignHCenter) + lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter) lbl.setObjectName("SliderHeader") header_layout.addWidget(lbl) header_widget = QWidget() diff --git a/src/AnswerTextField.py b/src/AnswerTextField.py index 037d3fbd21ff9fedc7253fae2ad0f72af5c54dd6..8d281a55621f43c93e6a9aa4fc71d2d871f58f61 100644 --- a/src/AnswerTextField.py +++ b/src/AnswerTextField.py @@ -1,9 +1,9 @@ """ This class creates a Textfield. """ -from PyQt5.QtCore import QRegExp, QLocale -from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator -from PyQt5.QtWidgets import QPlainTextEdit, QLineEdit +from PySide6.QtCore import QRegularExpression, QLocale +from PySide6.QtGui import QIntValidator, QDoubleValidator, QRegularExpressionValidator +from PySide6.QtWidgets import QPlainTextEdit, QLineEdit def make_answers(size, qid, policy=None, parent=None, objectname=None): @@ -42,15 +42,15 @@ def make_answers(size, qid, policy=None, parent=None, objectname=None): text.setValidator(QIntValidator(bottom=int(policy[1]), top=int(policy[2]))) elif policy[0].lower() == "double": validator = QDoubleValidator(bottom=float(policy[1]), top=float(policy[2]), decimals=int(policy[3])) - validator.setNotation(QDoubleValidator.StandardNotation) + validator.setNotation(QDoubleValidator.Notation.StandardNotation) # another parameter would be: notation (scientific 1.5E-2 or standard 0.015=default) text.setValidator(validator) if QLocale().decimalPoint() == ",": # workaround: QDoubleValidator only registers "," but not "." (depending on locale) text.textChanged.connect(lambda: text.setText(text.text().replace(".", ","))) elif policy[0].lower() == "regex": - text.setValidator(QRegExpValidator(QRegExp(policy[1]))) + text.setValidator(QRegularExpressionValidator(QRegularExpression(policy[1]))) else: - raise ValueError("Unknown validator found {}.".format(policy[0])) + raise ValueError(f"Unknown validator found {policy[0]}.") elif size > 1: # big text fields do not use validators text = QPlainTextEdit() @@ -60,6 +60,6 @@ def make_answers(size, qid, policy=None, parent=None, objectname=None): # print(size, text.font().pointSize(), size * QFontMetrics(text.font()).lineSpacing()) # text.setFixedHeight(size * QFontMetrics(text.font()).lineSpacing()*2) else: - raise ValueError("Size of text answer needs to be >= 1. Found {}.".format(size)) - text.textChanged.connect(lambda: parent.log(qid)) + raise ValueError(f"Size of text answer needs to be >= 1. Found {size}.") + text.textChanged.connect(lambda: parent.log(qid, text)) return text diff --git a/src/Configs/all_question_types.txt b/src/Configs/all_question_types.txt index e4cabc5efc4cd32936a1e954a8bc7102ad45bbe9..36f200e5c97f945324423bf7cb01d06e2189346c 100644 --- a/src/Configs/all_question_types.txt +++ b/src/Configs/all_question_types.txt @@ -28,6 +28,11 @@ video_player = None type = Check answers = yes, no id = CB1 + [[Check2]] + text = CheckBox example (0..n answers) + type = Check + answers = no, no + id = CB2 [[HLine]] type = HLine [[Password]] diff --git a/src/Configs/gosctest.txt b/src/Configs/gosctest.txt deleted file mode 100644 index 6e67ff9653c0d822b5855b6472422a41872fed4d..0000000000000000000000000000000000000000 --- a/src/Configs/gosctest.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Created with QUEST version 1.0.6 -video_player = None -global_osc_ip = 127.0.0.1 -global_osc_send_port = 9000 -global_osc_recv_port = 8000 -go_back = True -back_text = Zurück -forward_text = Weiter -send_text = Absenden -answer_pos = Ja -answer_neg = Nein -save_message = Sind Sie bereit den Fragebogen zu beenden und somit Ihre Angaben zu speichern? -pagecount_text = Seite {} von {} -filepath_results = ./results/resultsosc.csv -delimiter = ; -stylesheet = ./stylesheets/minimal.qss -button_fade = 100 -randomization = None -save_after = 2 -[1] -title = "" -[[1]] -type = OSCButton -id = oscb -inscription = Press -receiver = 127.0.0.1, 9000 -required = True -address = /sth -value = hello -[2] -title = "" -[[2]] -type = Check -id = cb -text = Did it receive? -answers = yes, no diff --git a/src/Configs/test.txt b/src/Configs/test.txt deleted file mode 100644 index 54571af17ab6f7e15a83315d3f71ff9a256c44a8..0000000000000000000000000000000000000000 --- a/src/Configs/test.txt +++ /dev/null @@ -1,37 +0,0 @@ -# Created with QUEST version 1.0.6 -video_player = None -pupil_ip = 127.0.0.1 -pupil_port = 9001 -go_back = False -back_text = Zurück -forward_text = Weiter -send_text = Absenden -answer_pos = Ja -answer_neg = Nein -save_message = Sind Sie bereit den Fragebogen zu beenden und somit Ihre Angaben zu speichern? -pagecount_text = Seite {} von {} -filepath_results = ./results/results.csv -delimiter = ; -stylesheet = ./stylesheets/minimal.qss -button_fade = 100 -randomization = None -save_after = 2 -[1] -title = "" -pupil_on_next = test -[2] -title = "" -[[test]] -type = Text -id = t1 -text = dies ist ein Test -size = 1 -policy = None, -[[OSC]] -type = OSCButton -id = osc -inscription = Bitte Drücken -receiver = 127.0.0.1, 9001 -address = /reply -required = True -value = page complete diff --git a/src/GUI.py b/src/GUI.py index 058d43d75bc43568308c50d43fa50cee89a8e513..1dc0ab447336d301d215be112051a2a4ce7daeb3 100644 --- a/src/GUI.py +++ b/src/GUI.py @@ -13,15 +13,16 @@ import threading import time import zmq -from PyQt5.QtCore import Qt, QTimer -from PyQt5.QtGui import QDoubleValidator -from PyQt5.QtWidgets import QWidget, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QStackedWidget, QApplication, \ - QMessageBox, QScrollArea, QButtonGroup, QCheckBox, QLineEdit, QPlainTextEdit, QSlider, QDesktopWidget, QSizePolicy +from PySide6.QtCore import Qt, QTimer, Signal +from PySide6.QtGui import QDoubleValidator, QGuiApplication +from PySide6.QtWidgets import QWidget, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QStackedWidget, QApplication, \ + QMessageBox, QScrollArea, QButtonGroup, QCheckBox, QLineEdit, QPlainTextEdit, QSlider, QSizePolicy from configobj import ConfigObj from ping3 import ping from pythonosc import udp_client, osc_server from pythonosc.dispatcher import Dispatcher +from src.AnswerCheckBox import CheckBox from src.LabeledSlider import LabeledSlider from src.MUSHRA import MUSHRA from src.MessageBox import ResizeMessageBox @@ -32,13 +33,13 @@ from src.PupilCoreButton import Button from src.RadioMatrix import RadioMatrix from src.Slider import Slider from src.Validator import listify, validate_questionnaire -from src.Video import * +from src.Video import madmapper, vlc from src.ABX import ABX from src.OSCButton import OSCButton -from src.randomization import * +from src.randomization import balanced_latin_squares, order_from_file -TIMEOUT = 0.5 # TODO change this to your liking -VERSION = "1.0.7" +TIMEOUT = 1 # TODO timeout in seconds, change this to your liking (has to be int) +VERSION = "1.1.0" class StackedWindowGui(QWidget): @@ -75,7 +76,7 @@ class StackedWindowGui(QWidget): self.save_message = "Sind Sie bereit den Fragebogen zu beenden und somit Ihre Angaben zu speichern?" self.pagecount_text = "Seite {} von {}" self.filepath_results = './results/results.csv' - self.filepath_log = './results/log_{}_{}.txt'.format(self.get_participant_number(), datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")) + self.filepath_log = f'./results/log_{self.get_participant_number()}_{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.txt' self.log = '' self.delimiter = ';' self.audio_ip = None @@ -107,29 +108,29 @@ class StackedWindowGui(QWidget): self.osc_server = None if not os.path.isfile(file): - raise FileNotFoundError("File {} does not exist.".format(file)) + raise FileNotFoundError(f"File {file} does not exist.") else: - print("Loading {}".format(file)) + print(f"Loading {file}") structure = ConfigObj(file) # reads the config file into a nested dict, this is all the magic error_found, warning_found, warning_det = validate_questionnaire(listify(structure), True) if not error_found: - ans_continue = QMessageBox.Yes + ans_continue = QMessageBox.StandardButton.Yes if warning_found and popup: msg = ResizeMessageBox() msg.setWindowTitle("Validation Result") msg.setSizeGripEnabled(True) - msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - msg.setIcon(QMessageBox.Warning) + msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + msg.setIcon(QMessageBox.Icon.Warning) msg.setText("The validation detected incomplete info. Do you want to continue?") warning_string = "" for warn in warning_det: warning_string += warn + "\n" msg.setDetailedText(warning_string) - msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) - msg.setDefaultButton(QMessageBox.No) - ans_continue = msg.exec_() - if ans_continue == QMessageBox.Yes or not popup: + msg.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No) + msg.setDefaultButton(QMessageBox.StandardButton.No) + ans_continue = msg.exec() + if ans_continue == QMessageBox.StandardButton.Yes or not popup: for key in structure: # Style properties if key == "stylesheet": @@ -215,10 +216,10 @@ class StackedWindowGui(QWidget): msg = QMessageBox() msg.setWindowTitle(self.connection_lost_title) msg.setSizeGripEnabled(True) - msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - msg.setIcon(QMessageBox.Information) - msg.setText("No connection to {}.".format(self.help_ip)) - msg.exec_() + msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + msg.setIcon(QMessageBox.Icon.Information) + msg.setText(f"No connection to {self.help_ip}.") + msg.exec() else: self.help_client = None if self.popup and not self.preview and self.global_osc_ip is not None and self.global_osc_send_port is not None: @@ -226,12 +227,10 @@ class StackedWindowGui(QWidget): else: self.global_osc_client = None if self.popup and not self.preview and self.global_osc_ip is not None and self.global_osc_recv_port is not None: - #self.global_osc_client = udp_client.SimpleUDPClient(self.global_osc_ip, self.global_osc_send_port) self.global_osc_server_thread = threading.Thread(target=self.osc_listener_default, args=[self.global_osc_recv_port]) self.global_osc_server_thread.daemon = True self.global_osc_server_thread.start() else: - #self.global_osc_client = None self.global_osc_server_thread = None no_zmq_connection = False if popup and not self.preview and self.pupil_ip is not None and self.pupil_port is not None: @@ -239,7 +238,7 @@ class StackedWindowGui(QWidget): self.pupil_remote = zmq.Socket(self.ctx, zmq.REQ) self.pupil_remote.setsockopt(zmq.RCVTIMEO, 2000) self.pupil_remote.connect('tcp://' + self.pupil_ip + ':' + self.pupil_port) - print("Connect to pupil "+'tcp://' + self.pupil_ip + ':' + self.pupil_port) + print("Connect to pupil " + 'tcp://' + self.pupil_ip + ':' + self.pupil_port) self.pupil_remote.send_string("v") retries_left = 3 success = False @@ -255,9 +254,9 @@ class StackedWindowGui(QWidget): if retries_left == 0 and self.popup: msg = QMessageBox() msg.setWindowTitle("Error") - msg.setIcon(QMessageBox.Critical) + msg.setIcon(QMessageBox.Icon.Critical) msg.setText("No connection with Pupil Capture possible!") - msg.exec_() + msg.exec() no_zmq_connection = True if not no_zmq_connection: self.pupil_remote = zmq.Socket(self.ctx, zmq.REQ) @@ -279,12 +278,12 @@ class StackedWindowGui(QWidget): else: self.audio_client = None self.audio_server_thread = None - self.filepath_log = '{}/log_{}_{}.txt'.format(self.filepath_results.rsplit("/", 1)[0], self.get_participant_number(), datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")) + self.filepath_log = f'{self.filepath_results.rsplit("/", 1)[0]}/log_{self.get_participant_number()}_{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.txt' if popup and not self.preview: print(self.filepath_log) if not os.path.isfile(stylesheet): - raise FileNotFoundError("File {} does not exist.".format(stylesheet)) + raise FileNotFoundError(f"File {stylesheet} does not exist.") else: with open(stylesheet, 'r') as css_file: self.css_data = css_file.read().replace('\n', '') @@ -294,7 +293,7 @@ class StackedWindowGui(QWidget): self.saved = False self.start = datetime.datetime.now() - self.log = "{} - Started GUI".format(self.start.replace(microsecond=0).__str__()) + self.log = f"{str(self.start.replace(microsecond=0))} - Started GUI" self.Stack = QStackedWidget(self) self.random_groups = [] @@ -358,8 +357,8 @@ class StackedWindowGui(QWidget): for o in order: self.Stack.addWidget(random_pages[o - 1]) elif len(random_pages) > 0 and not popup: - for page in range(len(random_pages)): - self.Stack.addWidget(random_pages[page]) + for _, page in enumerate(random_pages): + self.Stack.addWidget(page) self.Stack.currentChanged[int].connect(self.on_current_changed) @@ -383,7 +382,7 @@ class StackedWindowGui(QWidget): if self.help_client is not None and self.help_text is not None: self.help_button = QPushButton(self.help_text) self.help_button.clicked.connect(lambda: self.help_client.send_message("/help_request", "")) - self.help_button.clicked.connect(self.__click_animation) + self.help_button.clicked.connect(lambda: self.__click_animation(self.help_button)) self.navigation.addWidget(self.help_button) self.navigation.addStretch() elif (self.preview or not self.popup) and self.help_ip is not None and self.help_port is not None and self.help_text is not None: @@ -412,10 +411,10 @@ class StackedWindowGui(QWidget): self.setLayout(outerlayout) if self.popup and not self.preview: self.showFullScreen() - if self.width() <= QDesktopWidget().availableGeometry().width(): - scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - if self.height() <= QDesktopWidget().availableGeometry().height(): - scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + if self.width() <= QGuiApplication.primaryScreen().availableGeometry().width(): + scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + if self.height() <= QGuiApplication.primaryScreen().availableGeometry().height(): + scroll.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) self.show() self.on_current_changed(0) else: @@ -426,10 +425,10 @@ class StackedWindowGui(QWidget): self.disconnect_all(p.layout()) if self.preview and self.popup: self.showFullScreen() - if self.width() <= QDesktopWidget().availableGeometry().width(): - scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - if self.height() <= QDesktopWidget().availableGeometry().height(): - scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + if self.width() <= QGuiApplication.primaryScreen().availableGeometry().width(): + scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + if self.height() <= QGuiApplication.primaryScreen().availableGeometry().height(): + scroll.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) self.show() def osc_listener_reaper(self, port): @@ -441,7 +440,7 @@ class StackedWindowGui(QWidget): the port to listen on """ ip = socket.gethostbyname(socket.gethostname()) - print("Listening on {}:{}".format(ip, port)) + print(f"Listening on {ip}:{port}") dispatcher = Dispatcher() dispatcher.set_default_handler(self.play_state) self.reaper_server = osc_server.OSCUDPServer((ip, port), dispatcher) @@ -456,27 +455,27 @@ class StackedWindowGui(QWidget): the port to listen on """ ip = socket.gethostbyname(socket.gethostname()) - print("Listening on {}:{}".format(ip, port)) + print(f"Listening on {ip}:{port}") dispatcher = Dispatcher() dispatcher.set_default_handler(self.osc_reply) # Funktion, die ausgeführt wird self.osc_server = osc_server.OSCUDPServer((ip, port), dispatcher) self.osc_server.serve_forever() - def osc_reply(self, address, args): + def osc_reply(self, address, osc_args): """Monitor the incoming OSC messages from the default OSC listener. Parameters ---------- address : string OSC address of the message - args : tuple + osc_args : tuple value(s) of the message """ - print("Received", args) - self.global_osc_message = args - self.log += "\n{} - Received {} from global OSC".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.global_osc_message) + print("Received", osc_args, " from ", address) + self.global_osc_message = osc_args + self.log += f"\n{str(datetime.datetime.now().replace(microsecond=0))} - Received {self.global_osc_message} from global OSC" - def play_state(self, address, args): + def play_state(self, address, reap_args): """ Monitor the play state given by Reaper. Reaper will ping back any of the commands with either 0.0 or 1.0. @@ -484,26 +483,25 @@ class StackedWindowGui(QWidget): ---------- address : string OSC address of the message - args : tuple + reap_args : tuple value(s) of the message """ if address in ["/play", "/pause", "/stop"]: - if address == "/play" and args[0] == 1.0: + if address == "/play" and reap_args[0] == 1.0: self.global_play_state = "PLAY" - elif address == "/pause" and args[0] == 1.0: + elif address == "/pause" and reap_args[0] == 1.0: self.global_play_state = "PAUSE" - elif address == "/stop" and args[0] == 1.0: + elif address == "/stop" and reap_args[0] == 1.0: self.global_play_state = "STOP" if not self.stop_initiated: for player in self.Stack.currentWidget().players: - if player.playing and ((type(player) is Player and (player.timer is None or player.timer.remainingTime() == 0)) or type(player) is MUSHRA): + if player.playing and ((isinstance(player, Player) and (player.timer is None or player.timer.remainingTime() == 0)) or isinstance(player, MUSHRA)): player.stop_button.setEnabled(False) player.playing = False else: self.stop_initiated = False elif address.find("/track/") > -1 and int(address.split("/")[2]) > self.audio_tracks: self.audio_tracks = address.split("/")[2] - print("Changed audio_tracks to", self.audio_tracks) def disconnect_all(self, layout): """ Disconnect all widgets from their function for preview. @@ -517,11 +515,17 @@ class StackedWindowGui(QWidget): child = layout.itemAt(i) if child.widget(): try: - if type(child.widget()) == LabeledSlider: - child.widget().sl.disconnect() - if type(child.widget()) == Button: - child.widget().button.disconnect() - child.widget().disconnect() + if isinstance(child.widget(), LabeledSlider): + child.widget().sl.valueChanged.disconnect() + if isinstance(child.widget(), Slider): + child.widget().valueChanged.disconnect() + if child.widget().receivers(Signal("mushra_stopped(str)")) > 0: + child.widget().mushra_stopped.disconnect() + if isinstance(child.widget(), Button): + child.widget().button.clicked.disconnect() + if isinstance(child.widget(), CheckBox): + child.widget().toggled.disconnect() + # child.widget().clicked.disconnect() except TypeError: pass if child.layout() is not None: @@ -529,14 +533,14 @@ class StackedWindowGui(QWidget): def disconnect_nav(self): """Disconnect the navigation.""" - self.forwardbutton.disconnect() + self.forwardbutton.clicked.disconnect() if self.go_back: - self.backbutton.disconnect() + self.backbutton.clicked.disconnect() if self.help_client is not None: - self.help_button.disconnect() + self.help_button.clicked.disconnect() - def __click_animation(self): - __btn = self.sender() + def __click_animation(self, btn): + __btn = btn __btn.setDown(True) QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False)) @@ -550,34 +554,31 @@ class StackedWindowGui(QWidget): - When a player has a timer and didn't finish running, don't go to the next page """ for player in self.Stack.currentWidget().players: # stop current player - if player.playing and ((type(player) is Player and (player.timer is None or player.timer.remainingTime() == 0)) or type(player) is MUSHRA): + if player.playing and ((isinstance(player, Player) and (player.timer is None or player.timer.remainingTime() == 0)) or isinstance(player, MUSHRA)): player.stop() - if type(player) is MUSHRA: + if isinstance(player, MUSHRA): self.audio_client.send_message("/action", MUSHRA.unsolo_all) # check for required questions not_all_answered = False for quest in self.Stack.currentWidget().required.keys(): if self.Stack.currentWidget().required[quest][0]: ans = self.Stack.currentWidget().evaluationvars[quest] - if ((type(ans) is QButtonGroup) and (ans.checkedId() == -1)) or \ - ((type(ans) is QCheckBox) and not ans.isChecked()) or \ - ((type(ans) is QLineEdit or type(ans) is PasswordEntry) and (len(ans.text()) == 0)) or \ - ((type(ans) is QPlainTextEdit) and (len(ans.toPlainText()) == 0)) or \ - (((type(ans) is Slider) or (type(ans) is LabeledSlider)) and (ans.value() == ans.start) and not ans.get_moved()) or \ - ((type(ans) is list) and (len(ans) == 0) - and not self.Stack.currentWidget().required[quest][3]) or \ - ((type(ans) is list) and (type(ans[0]) is list) and (0 in (len(x) for x in ans)) - and not self.Stack.currentWidget().required[quest][3]) or \ - ((type(ans) is bool) and not ans) or \ - (type(ans) is ABX and ([] in self.Stack.currentWidget().required[quest][3] or ans.answer.checkedId() == -1) or \ - (type(ans) is RadioMatrix) and (-1 in [bg.checkedId() for bg in ans.buttongroups])) or \ - ((type(ans) is OSCButton or type(ans) is Button) and not ans.used): + if (isinstance(ans, QButtonGroup) and (ans.checkedId() == -1)) or \ + (isinstance(ans, QCheckBox) and not ans.isChecked()) or \ + (isinstance(ans, (QLineEdit, PasswordEntry)) and (len(ans.text()) == 0)) or \ + (isinstance(ans, QPlainTextEdit) and (len(ans.toPlainText()) == 0)) or \ + (isinstance(ans, (Slider, LabeledSlider)) and (ans.value() == ans.start) and not ans.get_moved()) or \ + (isinstance(ans, list) and (len(ans) == 0) and not self.Stack.currentWidget().required[quest][3]) or \ + (isinstance(ans, list) and (isinstance(ans[0], list)) and (0 in (len(x) for x in ans)) and not self.Stack.currentWidget().required[quest][3]) or \ + (isinstance(ans, bool) and not ans) or \ + (isinstance(ans, ABX) and ([] in self.Stack.currentWidget().required[quest][3] or ans.answer.checkedId() == -1)) or \ + (isinstance(ans, RadioMatrix) and (-1 in [bg.checkedId() for bg in ans.buttongroups])) or \ + (isinstance(ans, (OSCButton, Button)) and not ans.used): not_all_answered = True - if (type(self.Stack.currentWidget().required[quest][1]) is QLabel) or \ - (type(self.Stack.currentWidget().required[quest][1]) is QPushButton): + if isinstance(self.Stack.currentWidget().required[quest][1], (QLabel, QPushButton)): self.Stack.currentWidget().required[quest][1].setObjectName("required") self.Stack.currentWidget().required[quest][1].setStyleSheet(self.css_data) - elif type(ans) is ABX: + elif isinstance(ans, ABX): if ans.answer.checkedId() == -1: ans.label.setObjectName("required") else: @@ -606,36 +607,33 @@ class StackedWindowGui(QWidget): ans.label.setStyleSheet(self.css_data) self.Stack.currentWidget().required[quest][1][0].play_button.setStyleSheet(self.css_data) self.Stack.currentWidget().required[quest][1][1].play_button.setStyleSheet(self.css_data) - elif type(ans) is RadioMatrix: + elif isinstance(ans, RadioMatrix): for q in range(0, len(ans.questions)): - not_answered = False if ans.buttongroups[q].checkedId() == -1: self.Stack.currentWidget().required[quest][1][q].setObjectName("required") - self.Stack.currentWidget().required[quest][1][q].setStyleSheet(self.css_data) else: self.Stack.currentWidget().required[quest][1][q].setObjectName( str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2]) - self.Stack.currentWidget().required[quest][1][q].setStyleSheet(self.css_data) + self.Stack.currentWidget().required[quest][1][q].setStyleSheet(self.css_data) else: # MUSHRA for b in range(0, len(self.Stack.currentWidget().required[quest][1])): if len(ans[b]) < 1: self.Stack.currentWidget().required[quest][1][b].setObjectName("required") - self.Stack.currentWidget().required[quest][1][b].setStyleSheet(self.css_data) else: self.Stack.currentWidget().required[quest][1][b].setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2]) - self.Stack.currentWidget().required[quest][1][b].setStyleSheet(self.css_data) + self.Stack.currentWidget().required[quest][1][b].setStyleSheet(self.css_data) else: - if type(self.Stack.currentWidget().required[quest][1]) is QLabel: + if isinstance(self.Stack.currentWidget().required[quest][1], QLabel): if len(self.Stack.currentWidget().required[quest]) <= 2: self.Stack.currentWidget().required[quest][1].setObjectName(str()) else: self.Stack.currentWidget().required[quest][1].setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2]) self.Stack.currentWidget().required[quest][1].setStyleSheet(self.css_data) - elif type(self.Stack.currentWidget().required[quest][1]) is QPushButton: + elif isinstance(self.Stack.currentWidget().required[quest][1], QPushButton): self.Stack.currentWidget().required[quest][1].setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2]) self.Stack.currentWidget().required[quest][1].setStyleSheet(self.css_data) - elif type(ans) is ABX: + elif isinstance(ans, ABX): if ans.answer.checkedId() != -1: ans.label.setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2]) ans.label.setStyleSheet(self.css_data) @@ -648,7 +646,7 @@ class StackedWindowGui(QWidget): if ans.x_button is not None and len(ans.x_button.duration) >= 1: self.Stack.currentWidget().required[quest][1][2].play_button.setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2]) self.Stack.currentWidget().required[quest][1][2].play_button.setStyleSheet(self.css_data) - elif type(ans) is RadioMatrix: + elif isinstance(ans, RadioMatrix): for q in range(0, len(ans.questions)): if ans.buttongroups[q].checkedId() != -1: self.Stack.currentWidget().required[quest][1][q].setObjectName( @@ -663,10 +661,10 @@ class StackedWindowGui(QWidget): timer_running = False pw_valid = True for child in self.Stack.currentWidget().children(): - if type(child) is PasswordEntry: + if isinstance(child, PasswordEntry): pw_valid = child.validate() child.setStyleSheet(self.css_data) - elif type(child) is Player: + elif isinstance(child, Player): if child.timer is not None and child.countdown > 0: timer_running = True if not not_all_answered and pw_valid and not timer_running: @@ -677,20 +675,20 @@ class StackedWindowGui(QWidget): self.Stack.currentWidget().set_osc_message(self.global_osc_message) i = self.Stack.currentIndex() + 1 if i + 1 <= self.Stack.count(): - self.log += "\n{} - Changed to Page {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), i + 1) + self.log += f'\n{str(datetime.datetime.now().replace(microsecond=0))} - Changed to Page {i + 1}' if self.go_back and (i == 1) and (self.Stack.count() > 1) and not self.saved: # enable going back at page 2 self.backbutton.setEnabled(True) - if i == self.sections.index(self.save_after)+1: + if i == self.sections.index(self.save_after) + 1: answer = self.continue_message() - if answer == QMessageBox.AcceptRole: + if answer in [QMessageBox.ButtonRole.YesRole, QMessageBox.ButtonRole.AcceptRole]: if self.video_client is not None: - self.video_client.send_message(self.video_player_commands['blue_screen'][0] if 'blue_screen' in self.video_player_commands.keys() else self.video_player_commands["stop"][0], - self.video_player_commands['blue_screen'][1] if 'blue_screen' in self.video_player_commands.keys() else self.video_player_commands["stop"][1]) + self.video_client.send_message(self.video_player_commands['blue_screen'][0] if 'blue_screen' in self.video_player_commands else self.video_player_commands["stop"][0], + self.video_player_commands['blue_screen'][1] if 'blue_screen' in self.video_player_commands else self.video_player_commands["stop"][1]) if not self.preview: self.collect_and_save_data() self.saved = True self.Stack.setCurrentIndex(i) - if self.Stack.currentIndex() == self.Stack.count()-1: + if self.Stack.currentIndex() == self.Stack.count() - 1: self.forwardbutton.setEnabled(False) else: self.forwardbutton.setText(self.forward_text) @@ -717,11 +715,11 @@ class StackedWindowGui(QWidget): Handling of the back button linking. """ for player in self.Stack.currentWidget().players: - if player.playing and ((type(player) is Player and (player.timer is None or player.timer.remainingTime() == 0)) or type(player) is MUSHRA): + if player.playing and ((isinstance(player, Player) and (player.timer is None or player.timer.remainingTime() == 0)) or isinstance(player, MUSHRA)): player.stop() self.forwardbutton.setText(self.forward_text) i = self.Stack.currentIndex() - 1 - self.log += "\n{} - Changed to Page {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), i + 1) + self.log += f'\n{str(datetime.datetime.now().replace(microsecond=0))} - Changed to Page {i + 1}' if i > 0: self.Stack.setCurrentIndex(i) self.forwardbutton.setEnabled(True) @@ -746,19 +744,19 @@ class StackedWindowGui(QWidget): self.page_label = QLabel(self.pagecount_text, None) if not self.preview and (len(self.Stack.widget(self.prev_index).players) > 0) and (len(self.Stack.widget(index).players) == 0): if self.video_client is not None: - self.video_client.send_message(self.video_player_commands['black_screen'][0] if 'black_screen' in self.video_player_commands.keys() else self.video_player_commands["stop"][0], - self.video_player_commands['black_screen'][1] if 'black_screen' in self.video_player_commands.keys() else self.video_player_commands["stop"][1]) + self.video_client.send_message(self.video_player_commands['black_screen'][0] if 'black_screen' in self.video_player_commands else self.video_player_commands["stop"][0], + self.video_player_commands['black_screen'][1] if 'black_screen' in self.video_player_commands else self.video_player_commands["stop"][1]) self.prev_index = index for player in self.Stack.currentWidget().players: - if type(player) == Player and (player.buttons == [] or "Play" not in player.buttons) and not self.preview and self.popup: + if isinstance(player, Player) and (player.buttons == [] or "Play" not in player.buttons) and not self.preview and self.popup: player.play() if self.help_client is not None: help_str = str(index + 1) if len(self.Stack.currentWidget().players) > 0: for player in self.Stack.currentWidget().players: - help_str += '\tmarker:'+str(player.start_cue if type(player) != MUSHRA else player.start_cues)+' track:'+str(player.track if type(player) != MUSHRA else player.tracks) + help_str += f'\tmarker:{player.start_cue if not isinstance(player, MUSHRA) else player.start_cues} track:{player.track if not isinstance(player, MUSHRA) else player.tracks}' self.help_client.send_message("/page", help_str) def closeEvent(self, event): @@ -787,13 +785,14 @@ class StackedWindowGui(QWidget): value of the button clicked (True if it is supposed to be saved) """ msg = QMessageBox() - msg.setIcon(QMessageBox.Question) + msg.setIcon(QMessageBox.Icon.Question) msg.setText(self.save_message) msg.setWindowFlags(Qt.CustomizeWindowHint) # removes title bar - msg.addButton(self.answer_pos, QMessageBox.AcceptRole) - msg.addButton(self.answer_neg, QMessageBox.RejectRole) + msg.addButton(self.answer_pos, QMessageBox.ButtonRole.AcceptRole) + msg.addButton(self.answer_neg, QMessageBox.ButtonRole.RejectRole) msg.setStyleSheet(self.css_data) - retval = msg.exec_() + msg.exec() + retval = msg.buttonRole(msg.clickedButton()) return retval def collect_and_save_data(self): @@ -812,12 +811,12 @@ class StackedWindowGui(QWidget): self.pupil_remote.recv_string() except zmq.ZMQError: print("Couldn't connect with Pupil Capture!") - + emoji_pattern = re.compile("[" - u"\U0001F600-\U0001F64F" # emoticons - u"\U0001F300-\U0001F5FF" # symbols & pictographs - u"\U0001F680-\U0001F6FF" # transport & map symbols - u"\U0001F1E0-\U0001F1FF" # flags (iOS) + u"\U0001F600-\U0001F64F" # emoticons + u"\U0001F300-\U0001F5FF" # symbols & pictographs + u"\U0001F680-\U0001F6FF" # transport & map symbols + u"\U0001F1E0-\U0001F1FF" # flags (iOS) u"\U00002500-\U000027B0" u"\U000024C2-\U0001F251" u"\U0001f926-\U0001f937" @@ -839,38 +838,38 @@ class StackedWindowGui(QWidget): for s in range(0, self.Stack.count()): if self.Stack.widget(s).evaluationvars is not None: for qid, ans in self.Stack.widget(s).evaluationvars.items(): - if type(ans) is ABX: + if isinstance(ans, ABX): fields[qid + "_order"] = ans.order fields[qid + "_answer"] = ans.answer.checkedId() fields[qid + "_duration_A"] = ans.a_button.duration fields[qid + "_duration_B"] = ans.b_button.duration if ans.x_button is not None: fields[qid + "_duration_X"] = ans.x_button.duration - elif type(ans) is RadioMatrix: - for pqid in range(len(ans.id_order)): + elif isinstance(ans, RadioMatrix): + for pqid, rmans in enumerate(ans.id_order): if len(ans.questions) >= 10: - fields[qid + "_{0:02d}".format(ans.id_order[pqid])] = ans.buttongroups[pqid].checkedId() + fields[f'{qid}_{rmans:02d}'] = ans.buttongroups[pqid].checkedId() else: - fields[qid + "_{}".format(ans.id_order[pqid])] = ans.buttongroups[pqid].checkedId() + fields[f'{qid}_{rmans}'] = ans.buttongroups[pqid].checkedId() fields[qid + "_order"] = ans.id_order else: - if type(ans) is QButtonGroup: + if isinstance(ans, QButtonGroup): fields[qid] = ans.checkedId() - elif type(ans) is QCheckBox: + elif isinstance(ans, QCheckBox): fields[qid] = ans.isChecked() - elif type(ans) is QLineEdit or type(ans) is PasswordEntry: - if type(ans.validator()) == QDoubleValidator: + elif isinstance(ans, (QLineEdit, PasswordEntry)): + if isinstance(ans.validator(), QDoubleValidator): ans.setText(ans.text().replace(",", ".")) fields[qid] = ans.text() # remove any emojis - fields[qid] = re.sub(emoji_pattern, '', fields[qid]) - elif type(ans) is QPlainTextEdit: + fields[qid] = re.sub(emoji_pattern, '', fields[qid]) + elif isinstance(ans, QPlainTextEdit): fields[qid] = ans.toPlainText().replace("\n", " ") # remove any emojis - fields[qid] = re.sub(emoji_pattern, '', fields[qid]) - elif (type(ans) is Slider) or (type(ans) is LabeledSlider) or (type(ans) is QSlider): + fields[qid] = re.sub(emoji_pattern, '', fields[qid]) + elif isinstance(ans, (Slider, LabeledSlider, QSlider)): fields[qid] = ans.value() - elif (type(ans) is Button) or type(ans) is OSCButton: + elif isinstance(ans, (Button, OSCButton)): fields[qid] = ans.used else: fields[qid] = ans @@ -878,24 +877,24 @@ class StackedWindowGui(QWidget): fields["Order"] = [] for rg in self.random_groups: if not fields["data_row_number"] == -1: - fields["Order"].append(balanced_latin_squares(rg)[(self.get_participant_number()-1) % len(balanced_latin_squares(rg))]) + fields["Order"].append(balanced_latin_squares(rg)[(self.get_participant_number() - 1) % len(balanced_latin_squares(rg))]) else: fields["Order"] = "unknown" elif self.rand == "from file": - fields["Order"] = order_from_file(self.rand_file)[self.get_participant_number()-1] + fields["Order"] = order_from_file(self.rand_file)[self.get_participant_number() - 1] end = datetime.datetime.now() - self.log += "\n{} - Finished Questionnaire".format(end.replace(microsecond=0).__str__()) - fields["Start"] = self.start.__str__() - fields["End"] = end.__str__() + self.log += f'\n{str(end.replace(microsecond=0))} - Finished Questionnaire' + fields["Start"] = str(self.start) + fields["End"] = str(end) path = self.filepath_log.rsplit("/", 1) if not os.path.exists(self.filepath_log): if path[0] != "." and path[0] != [".."]: os.makedirs(path[0] + "/", exist_ok=True) # remove any emojis - self.log = re.sub(emoji_pattern, '', self.log) - + self.log = re.sub(emoji_pattern, '', self.log) + log_file = open(self.filepath_log, 'w') log_file.write(self.log) log_file.close() @@ -908,20 +907,22 @@ class StackedWindowGui(QWidget): writer = csv.writer(csvfile, delimiter=self.delimiter) header = fields.keys() writer.writerow(header) - + print("wrote header") + print("resultsfile exists", os.path.exists(self.filepath_results)) + time.sleep(5) try: headers = [] with open(self.filepath_results, 'r', newline='', encoding='utf_8') as f: d_reader = csv.DictReader(f, delimiter=self.delimiter) headers = d_reader.fieldnames - print(headers) + # print("Header",headers) time.sleep(2) with open(self.filepath_results, "a", newline='', encoding='utf_8') as csvfile: writer = csv.writer(csvfile, delimiter=self.delimiter) row = [] - print(headers) - for field in range(0, len(headers)): - row.append(fields[headers[field]]) + # print(headers) + for _, hfield in enumerate(headers): + row.append(fields[hfield]) writer.writerow(row) except (PermissionError, KeyError): print("Can not access results file, saving backup!") @@ -929,15 +930,15 @@ class StackedWindowGui(QWidget): participant_number = self.get_participant_number() except PermissionError: # file can't be read participant_number = "unknown" - self.filepath_results = path[0]+"/"+str(participant_number)+"_backup_"+datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")+".csv" - print("Backup file: {}".format(self.filepath_results)) + self.filepath_results = f'{path[0]}/{participant_number}_backup_{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.csv' + print(f'Backup file: {self.filepath_results}') with open(self.filepath_results, "w+", newline='', encoding='utf_8') as csvfile: writer = csv.writer(csvfile, delimiter=self.delimiter) header = list(fields.keys()) writer.writerow(header) row = [] - for field in range(0, len(header)): - row.append(fields[header[field]]) + for _, hfield in enumerate(header): + row.append(fields[hfield]) writer.writerow(row) print("DONE") @@ -973,10 +974,10 @@ class StackedWindowGui(QWidget): msg = QMessageBox() msg.setWindowTitle(self.connection_lost_title) msg.setSizeGripEnabled(True) - msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - msg.setIcon(QMessageBox.Information) + msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + msg.setIcon(QMessageBox.Icon.Information) msg.setText(self.connection_lost_text) - msg.exec_() + msg.exec() if self.video_ip is not None: host = self.video_ip response = ping(host, timeout=TIMEOUT) @@ -986,10 +987,10 @@ class StackedWindowGui(QWidget): msg = QMessageBox() msg.setWindowTitle(self.connection_lost_title) msg.setSizeGripEnabled(True) - msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - msg.setIcon(QMessageBox.Information) + msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + msg.setIcon(QMessageBox.Icon.Information) msg.setText(self.connection_lost_text) - msg.exec_() + msg.exec() if self.pupil_ip is not None: host = self.pupil_ip response = ping(host, timeout=TIMEOUT) @@ -999,10 +1000,10 @@ class StackedWindowGui(QWidget): msg = QMessageBox() msg.setWindowTitle(self.connection_lost_title) msg.setSizeGripEnabled(True) - msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - msg.setIcon(QMessageBox.Information) + msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + msg.setIcon(QMessageBox.Icon.Information) msg.setText(self.connection_lost_text) - msg.exec_() + msg.exec() if __name__ == '__main__': @@ -1012,4 +1013,4 @@ if __name__ == '__main__': app = QApplication(sys.argv) ex = StackedWindowGui(args.file) - sys.exit(app.exec_()) + sys.exit(app.exec()) diff --git a/src/Image.py b/src/Image.py index 6596a78c7bb756d151eb6cc4d6f9d86b6fcb10a0..dd9709e829112d98134074037f308a4afb5926a1 100644 --- a/src/Image.py +++ b/src/Image.py @@ -1,7 +1,7 @@ """A question type to display an image in the questionnaire.""" -from PyQt5.QtGui import QPixmap -from PyQt5.QtWidgets import QLabel +from PySide6.QtGui import QPixmap +from PySide6.QtWidgets import QLabel class Image(QLabel): @@ -15,9 +15,9 @@ class Image(QLabel): ---------- file : str image file to display - x : int, opt + x : Union(int, None), opt x coordinate of top left corner (to the right) - y : int, opt + y : Union(int, None), opt y coordinate of top left corner (down) width : int, optional width in display diff --git a/src/LabeledSlider.py b/src/LabeledSlider.py index e39622d1b5625886e6aca5528df8323d737c0029..360367eef5c6cda859f04a7821f41f7cf2eb7a5b 100644 --- a/src/LabeledSlider.py +++ b/src/LabeledSlider.py @@ -3,10 +3,10 @@ This functionality is from: https://stackoverflow.com/questions/47494305/python-pyqt4-slider-with-tick-labels """ -from PyQt5 import QtWidgets -from PyQt5.QtCore import QRect, QPoint, Qt, QObject -from PyQt5.QtGui import QPainter -from PyQt5.QtWidgets import QStyle, QStyleOptionSlider +from PySide6 import QtWidgets +from PySide6.QtCore import QRect, QPoint, Qt +from PySide6.QtGui import QPainter +from PySide6.QtWidgets import QStyle, QStyleOptionSlider from src.Slider import Slider @@ -18,7 +18,7 @@ class LabeledSlider(QtWidgets.QWidget): This functionality is from: https://stackoverflow.com/questions/47494305/python-pyqt4-slider-with-tick-labels """ - def __init__(self, minimum, maximum, start, step=1, orientation=Qt.Horizontal, labels=None, parent=None, objectname=None): + def __init__(self, minimum, maximum, start, step=1, tick_interval=1, orientation=Qt.Orientation.Horizontal, labels=None, parent=None, objectname=None): """ Parameters @@ -30,7 +30,9 @@ class LabeledSlider(QtWidgets.QWidget): start : int default position of the slider's handle, if outside minimum/maximum, it is set to the nearest value step : int, default=1 - numerical distance between tick values + numerical distance between valid values + tick_interval : int, default=1 + numerical distance between displayed ticks values orientation : Qt.Orientation, default=Qt.Horizontal orientation of the slider labels : list[str] or tuple[str], default=None @@ -50,8 +52,8 @@ class LabeledSlider(QtWidgets.QWidget): """ super(LabeledSlider, self).__init__(parent=parent) - levels = range(int((maximum-minimum)/step)+1) if minimum < maximum \ - else range((int((maximum-minimum)/step)*-1+1)) + levels = range(int((maximum - minimum) / tick_interval) + 1) if minimum < maximum \ + else range((int((maximum - minimum) / tick_interval) * -1 + 1)) if labels is not None: if not isinstance(labels, (tuple, list)): raise TypeError("<labels> is a list or tuple.") @@ -62,17 +64,15 @@ class LabeledSlider(QtWidgets.QWidget): else: new_labels = [""] * len(levels) for pair in labels: - new_labels[int(abs(pair[0]-minimum)/step)] = pair[1] + new_labels[int(abs(pair[0] - minimum) / tick_interval)] = pair[1] self.levels = list(zip(levels, new_labels)) else: - labels = self.create_range(minimum, maximum, step) - # levels = range(minimum, maximum + step, step) if minimum < maximum \ - # else range(minimum, maximum + step * -1, step * -1) + labels = self.create_range(minimum, maximum, tick_interval) self.levels = list(zip(levels, map(str, labels))) - if orientation == Qt.Horizontal: + if orientation == Qt.Orientation.Horizontal: self.layout = QtWidgets.QVBoxLayout(self) - elif orientation == Qt.Vertical: + elif orientation == Qt.Orientation.Vertical: self.layout = QtWidgets.QHBoxLayout(self) else: raise ValueError("<orientation> wrong.") @@ -89,7 +89,7 @@ class LabeledSlider(QtWidgets.QWidget): self.sl = Slider(orientation, parent=parent) if objectname is not None: self.sl.setObjectName(objectname) - self.sl.prepare_slider(minimum, maximum, start, step, tickpos=QtWidgets.QSlider.TicksBelow if orientation == Qt.Horizontal else QtWidgets.QSlider.TicksLeft) + self.sl.prepare_slider(minimum, maximum, start, step=step, tickpos=QtWidgets.QSlider.TickPosition.TicksBelow if orientation == Qt.Orientation.Horizontal else QtWidgets.QSlider.TickPosition.TicksLeft) self.layout.addWidget(self.sl) @@ -128,53 +128,44 @@ class LabeledSlider(QtWidgets.QWidget): st_slider.initFrom(self.sl) st_slider.orientation = self.sl.orientation() - length = style.pixelMetric(QStyle.PM_SliderLength, st_slider, self.sl) - available = style.pixelMetric(QStyle.PM_SliderSpaceAvailable, st_slider, self.sl) + available = style.pixelMetric(QStyle.PixelMetric.PM_SliderSpaceAvailable, st_slider, self.sl) for v, v_str in self.levels: # get the size of the label - if type(v_str) != str: + if not isinstance(v_str, str): v_str = str(v_str) - rect = painter.drawText(QRect(), Qt.TextDontPrint | Qt.TextDontClip, v_str) - rect.setHeight(int(rect.height()*1.5)) + rect = painter.drawText(QRect(), Qt.TextFlag.TextDontPrint | Qt.TextFlag.TextDontClip, v_str) + rect.setHeight(int(rect.height() * 1.5)) - if self.sl.orientation() == Qt.Horizontal: + if self.sl.orientation() == Qt.Orientation.Horizontal: # I assume the offset is half the length of slider, therefore + length//2 - x_loc = QStyle.sliderPositionFromValue(self.sl.minimum(), self.sl.maximum(), v, available, self.sl.invertedAppearance()) + length // 2 - - # left bound of the text = center - half of text width + L_margin - left = x_loc - int(rect.width() / 2) + self.left_margin - bottom = self.rect().bottom() - int(self.rect().height()/6) + x_loc = v * available / (len(self.levels) - 1) # Because SOMEHOW sliderPositionFromValue does no like inverted sliders + left = int(x_loc - rect.width() / 2) + bottom = self.rect().bottom() - int(self.rect().height() / 7) + if v == 0 and left < 0: + left = 0 + # enlarge margins if clipping - if v == self.sl.minimum(): - if left <= 0: - self.left_margin = rect.width() // 2 - x_loc - if self.bottom_margin <= rect.height(): - self.bottom_margin = rect.height() - - self.layout.setContentsMargins(self.left_margin, self.top_margin, self.right_margin, self.bottom_margin) + if self.bottom_margin < rect.height(): + self.bottom_margin = rect.height() - if v == self.sl.maximum() and rect.width() // 2 >= self.right_margin: + if v == len(self.levels) - 1 and rect.width() // 2 > self.right_margin and left + rect.width() > available: self.right_margin = rect.width() // 2 - self.layout.setContentsMargins(self.left_margin, self.top_margin, self.right_margin, self.bottom_margin) + + self.layout.setContentsMargins(self.left_margin, self.top_margin, self.right_margin, self.bottom_margin) else: - y_loc = QStyle.sliderPositionFromValue(self.sl.minimum(), self.sl.maximum(), v, available, upsideDown=True) # , self.sl.invertedAppearance() todo - - bottom = y_loc + length // 2 + rect.height() // 2 + self.top_margin - 3 - # there is a 3 px offset that I can't attribute to any metric + y_loc = QStyle.sliderPositionFromValue(self.sl.minimum(), self.sl.maximum(), v, available, upsideDown=True) + bottom = y_loc + rect.height() left = self.left_margin - rect.width() - if left <= 0: - self.left_margin = rect.width() + 2 - self.layout.setContentsMargins(self.left_margin, self.top_margin, self.right_margin, self.bottom_margin) pos = QPoint(left, bottom) painter.drawText(pos, str(v_str)) - def create_range(self, minimum, maximum, step): + def create_range(self, minimum, maximum, tick_step): """ Create a range with floats. @@ -184,7 +175,7 @@ class LabeledSlider(QtWidgets.QWidget): minimum value maximum : int maximum value - step : float + tick_step : float stepwidth Returns @@ -193,24 +184,23 @@ class LabeledSlider(QtWidgets.QWidget): created range """ vals = [] - if int(step) == float(step) and int(minimum) == float(minimum) and int(maximum) == float(maximum): - step = int(step) + if int(tick_step) == float(tick_step) and int(minimum) == float(minimum) and int(maximum) == float(maximum): + tick_step = int(tick_step) minimum = int(minimum) maximum = int(maximum) - vals = range(minimum, maximum + step, step) if minimum < maximum else range(minimum, maximum - step, -1 * step) + vals = range(minimum, maximum + tick_step, tick_step) if minimum < maximum else range(minimum, maximum - tick_step, -1 * tick_step) else: tmp = None minimum = float(minimum) if minimum > maximum: - tmp = minimum - minimum = maximum - maximum = tmp + minimum, maximum = maximum, minimum + tmp = True while minimum <= maximum: if int(minimum) == float(minimum): vals.append(int(minimum)) else: - vals.append(round(minimum, str(step)[::-1].find('.')) if round(minimum, str(step)[::-1].find('.')) != -0.0 else 0.0) - minimum += step + vals.append(round(minimum, str(tick_step)[::-1].find('.')) if round(minimum, str(tick_step)[::-1].find('.')) != -0.0 else 0.0) + minimum += tick_step if tmp is not None: vals.reverse() return vals diff --git a/src/Launcher.py b/src/Launcher.py index 9ab169759c1bd8c7d049d6f616ff6a4ca8161d13..8a0052c1fd726bd885a2a922bd0f4fa7be7462c6 100644 --- a/src/Launcher.py +++ b/src/Launcher.py @@ -3,7 +3,7 @@ Main entry point for the project. """ import sys -from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QFileDialog, QMessageBox +from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QFileDialog, QMessageBox from src.GUI import StackedWindowGui, VERSION from src.QEditGui import QEditGuiMain @@ -30,23 +30,23 @@ class Launcher(QWidget): self.questionnaire_window = None self.setStyleSheet("QPushButton {padding: 7px; margin: 3px; }") self.setLayout(layout) - self.setWindowTitle("QUEST {}".format(VERSION)) + self.setWindowTitle(f'QUEST {VERSION}') self.show() def run_questionnaire(self): """Get questionnaire file and run the GUI.""" dlg = QFileDialog(self) - dlg.setFileMode(QFileDialog.ExistingFile) + dlg.setFileMode(QFileDialog.FileMode.ExistingFile) dlg.setNameFilter("Text files (*.txt)") dlg.setStyle(self.style()) - if dlg.exec_(): + if dlg.exec(): file = dlg.selectedFiles()[0] self.questionnaire_window = StackedWindowGui(file) def run_questionnaire_editor(self): """Run the questionnaire editor GUI.""" - editgui = QEditGuiMain(self) + editgui = QEditGuiMain() editgui.show() @staticmethod @@ -54,15 +54,15 @@ class Launcher(QWidget): """Display basic information about the software and a link to the wiki.""" msg = QMessageBox() msg.setWindowTitle("Help / About") - msg.setIcon(QMessageBox.Information) + msg.setIcon(QMessageBox.Icon.Information) msg.setText("This software was created by Daphne Schössow.") msg.setInformativeText("For detailed instructions on how to use this software, " "have a look at the <a href=https://gitlab.uni-hannover.de/da.schoessow/quest/-/wikis/overview>wiki</a> of this project at gitlab. " - "For further problems, feature request, or feedback create an issue at gitlab or contact <a href=mailto:daphne.schoessow@ikt.uni-hannover.de> via mail</a>.") - msg.exec_() + "For further problems, feature request, or feedback create an issue at gitlab or contact <a href=mailto:schoessow@ikt.uni-hannover.de> via mail</a>.") + msg.exec() if __name__ == '__main__': app = QApplication([]) ex = Launcher() - sys.exit(app.exec_()) + sys.exit(app.exec()) diff --git a/src/Lines.py b/src/Lines.py index c4655becfde267648a6431e10dcd0b2e4e1aab46..3f3d26d867bf44ca595ac03a529fb0b9eb034bc3 100644 --- a/src/Lines.py +++ b/src/Lines.py @@ -1,11 +1,11 @@ """ Helper to create lines. -These classes are used to create neat lines in PyQt5, which can be used e.g. as separators. +These classes are used to create neat lines in PySide6, which can be used e.g. as separators. The idea is adapted from: https://stackoverflow.com/questions/5671354/how-to-programmatically-make-a-horizontal-line-in-qt """ -from PyQt5.QtWidgets import QFrame +from PySide6.QtWidgets import QFrame class QHLine(QFrame): @@ -21,8 +21,8 @@ class QHLine(QFrame): name of the object, if it is supposed to be styled individually """ super(QHLine, self).__init__() - self.setFrameShape(QFrame.HLine) - self.setFrameShadow(QFrame.Sunken) + self.setFrameShape(QFrame.Shape.HLine) + self.setFrameShadow(QFrame.Shadow.Sunken) if objectname is not None: self.setObjectName(objectname) @@ -40,7 +40,7 @@ class QVLine(QFrame): name of the object, if it is supposed to be styled individually """ super(QVLine, self).__init__() - self.setFrameShape(QFrame.VLine) - self.setFrameShadow(QFrame.Sunken) + self.setFrameShape(QFrame.Shape.VLine) + self.setFrameShadow(QFrame.Shadow.Sunken) if objectname is not None: self.setObjectName(objectname) diff --git a/src/MUSHRA.py b/src/MUSHRA.py index ac996b8888165203fbc78e3c420270053d5c49b5..b0f64cb8150f68084c274b9dbd641f377c8f371b 100644 --- a/src/MUSHRA.py +++ b/src/MUSHRA.py @@ -2,8 +2,8 @@ import datetime from time import time -from PyQt5.QtCore import Qt, QSignalMapper, QObject, QTimer -from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QLabel, QSlider, QSizePolicy +from PySide6.QtCore import Qt, QSignalMapper, QTimer +from PySide6.QtWidgets import QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QLabel, QSlider, QSizePolicy from src.Slider import Slider @@ -75,7 +75,7 @@ class MUSHRA(QWidget): self.id = qid self.start_cues = start_cues self.end_cues = end_cues - if type(tracks) is str and ("[" not in tracks and "]" not in tracks and "," not in tracks): + if isinstance(tracks, str) and ("[" not in tracks and "]" not in tracks and "," not in tracks): tracks = [int(tracks)] self.tracks = tracks self.start = 0 @@ -114,67 +114,65 @@ class MUSHRA(QWidget): labels.addStretch(int(height / 10)) l90 = QLabel("excellent") l90.setObjectName(self.objectName()) - l90.setAlignment(Qt.AlignRight | Qt.AlignVCenter) + l90.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) labels.addWidget(l90) labels.addStretch(int(height / 5)) l70 = QLabel("good") l70.setObjectName(self.objectName()) - l70.setAlignment(Qt.AlignRight | Qt.AlignVCenter) + l70.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) labels.addWidget(l70) labels.addStretch(int(height / 5)) l50 = QLabel("fair") l50.setObjectName(self.objectName()) - l50.setAlignment(Qt.AlignRight | Qt.AlignVCenter) + l50.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) labels.addWidget(l50) labels.addStretch(int(height / 5)) l30 = QLabel("poor") l30.setObjectName(self.objectName()) - l30.setAlignment(Qt.AlignRight | Qt.AlignVCenter) + l30.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) labels.addWidget(l30) labels.addStretch(int(height / 5)) l10 = QLabel("bad") l10.setObjectName(self.objectName()) - l10.setAlignment(Qt.AlignRight | Qt.AlignVCenter) + l10.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) labels.addWidget(l10) labels.addStretch(int(height / 10)) self.refbutton = QPushButton("Reference") self.refbutton.setObjectName(self.objectName()) - self.refbutton.clicked.connect(lambda: self.play(0)) - self.refbutton.clicked.connect(self.__click_animation) + self.refbutton.clicked.connect(lambda: self.play(0, self.refbutton)) + self.refbutton.clicked.connect(lambda: self.__click_animation(self.refbutton)) labels.addWidget(self.refbutton) h.addItem(labels) h.addSpacing(5) else: - slider = Slider(Qt.Vertical, parent=parent) + slider = Slider(Qt.Orientation.Vertical, parent=parent) slider.setObjectName(self.objectName()) slider.setMinimumHeight(self.slider_height) - slider.prepare_slider(min_val=0, max_val=100, start=100, step=20, tickpos=QSlider.TicksLeft) + slider.prepare_slider(min_val=0, max_val=100, start=100, step=1, tick_interval=20, tickpos=QSlider.TickPosition.TicksLeft, sid=f'{self.id}_{len(self.sliders) + 1}') slider.setEnabled(False) - slider.valueChanged.connect(mapper.map) - mapper.setMapping(slider, self.id + "_{}".format(m)) self.sliders.append(slider) - slider.mushra_stopped.connect(lambda: self.parent().log(self.id + "_{}".format(self.sliders.index(mapper.sender())+1))) - lbl = QLabel("{}".format(slider.value())) + slider.mushra_stopped.connect(self.raise_log) + lbl = QLabel(f'{slider.value()}') lbl.setObjectName(self.objectName()) - lbl.setAlignment(Qt.AlignHCenter) + lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter) self.labels.append(lbl) slider.valueChanged.connect(self.update_label) - start_button = QPushButton("{}".format(m)) + start_button = QPushButton(f'{m}') start_button.setObjectName(self.objectName()) self.buttons.append(start_button) start_button.clicked.connect(mapper.map) - start_button.clicked.connect(self.__click_animation) + start_button.clicked.connect(lambda: self.__click_animation(start_button)) mapper.setMapping(start_button, m) sliderlayout = QVBoxLayout() sliderlayout.addWidget(slider) - sliderlayout.setAlignment(Qt.AlignHCenter) + sliderlayout.setAlignment(Qt.AlignmentFlag.AlignHCenter) vbox.addWidget(lbl) vbox.addItem(sliderlayout) vbox.addWidget(start_button) - vbox.setAlignment(Qt.AlignHCenter) + vbox.setAlignment(Qt.AlignmentFlag.AlignHCenter) h.addItem(vbox) self.duration.append([]) - mapper.mapped[int].connect(self.play) + mapper.mappedInt.connect(self.play) player = QHBoxLayout() self.loop_button = QPushButton("Loop") self.loop_button.setObjectName(self.objectName()) @@ -202,15 +200,15 @@ class MUSHRA(QWidget): player.addWidget(self.xfade) player.addWidget(self.pause_button) player.addWidget(self.stop_button) - player.setAlignment(Qt.AlignCenter) + player.setAlignment(Qt.AlignmentFlag.AlignCenter) layout = QVBoxLayout() layout.addItem(h) layout.addItem(player) - self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding) + self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding) self.setLayout(layout) - def __click_animation(self): - __btn = self.sender() + def __click_animation(self, btn): + __btn = btn __btn.setDown(True) QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False)) @@ -230,41 +228,49 @@ class MUSHRA(QWidget): for i in range(1, self.audio_tracks + 1): if len(self.tracks) < len(self.buttons) + 1: # only one track if i in self.tracks: # single track - self.audio_client.send_message("/track/{}/mute".format(i), 0) + self.audio_client.send_message(f'/track/{i}/mute', 0) else: - self.audio_client.send_message("/track/{}/mute".format(i), 1) + self.audio_client.send_message(f'/track/{i}/mute', 1) elif (len(self.tracks) == len(self.buttons) + 1) and ( - type(self.tracks[self.last_sender]) is not list): # 1 track per button + not isinstance(self.tracks[self.last_sender], list)): # 1 track per button if i == self.tracks[self.last_sender]: - self.audio_client.send_message("/track/{}/mute".format(i), 0) + self.audio_client.send_message(f'/track/{i}/mute', 0) else: - self.audio_client.send_message("/track/{}/mute".format(i), 1) + self.audio_client.send_message(f'/track/{i}/mute', 1) elif (len(self.tracks) == len(self.buttons) + 1) and ( - type(self.tracks[self.last_sender]) is list): # more than one track per stimulus + not isinstance(self.tracks[self.last_sender], list)): # more than one track per stimulus if i in self.tracks[self.last_sender]: - self.audio_client.send_message("/track/{}/mute".format(i), 0) + self.audio_client.send_message(f'/track/{i}/mute', 0) else: - self.audio_client.send_message("/track/{}/mute".format(i), 1) + self.audio_client.send_message(f'/track/{i}/mute', 1) def update_label(self): """Update the label above the slider that indicates the handle position, when the handle was moved.""" - for s in range(0, len(self.sliders)): - if self.sliders[s].value() == 100: - self.labels[s].setText("{}".format(self.sliders[s].value())) - else: - self.labels[s].setText("{}".format(self.sliders[s].value())) - self.labels[s].setFixedWidth(QLabel("100").maximumWidth()) + for s, sli in enumerate(self.sliders): + if self.labels[s].text() != str(sli.value()): + self.labels[s].setText(f'{sli.value()}') + self.labels[s].setFixedWidth(QLabel("100").maximumWidth()) + + def raise_log(self, who): + '''Make a log entry. + + Parameters + ---------- + who : Slider + The Slider whose signal that trigged a change in value. + ''' + self.parent().log(who, self.sliders[int(who.split('_')[1]) - 1]) def loop(self): """Toggle looping.""" self.looped = not self.looped if self.looped: self.loop_button.setChecked(True) - self.parent().page_log += "\n\t{} - Loop on {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Loop on {self.id}' self.audio_client.send_message("/action", self.loop_on_command) else: self.loop_button.setChecked(False) - self.parent().page_log += "\n\t{} - Loop off {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Loop off {self.id}' self.audio_client.send_message("/action", self.loop_off_command) def pause(self): @@ -274,7 +280,7 @@ class MUSHRA(QWidget): self.paused = True self.audio_client.send_message("/pause", 1) self.pause_button.setChecked(True) - self.parent().page_log += "\n\t{} - Paused MUSHRA-player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Paused MUSHRA-player {self.id}' self.end = time() self.duration[self.current].append(self.end - self.start) else: @@ -282,55 +288,58 @@ class MUSHRA(QWidget): self.paused = False self.audio_client.send_message("/pause", 1) self.pause_button.setChecked(False) - self.parent().page_log += "\n\t{} - Unpaused MUSHRA-player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused MUSHRA-player {self.id}' self.start = time() self.end = 0 - def play(self, cue=None): + def play(self, cue=None, btn=None): """ - Start the playback of audio of the according stimulus. + Start the playback of audio of the according stimulus. - Parameters - ---------- - cue : int, default=None - index of the stimulus in the start/end cues array + Parameters + ---------- + cue : int, default=None + index of the stimulus in the start/end cues array + btn: QPushButton, default=None + button which initiated play """ for player in self.parent().players: - if player.playing and (not player == self and not self.conditionsUseSameMarker or - (self.conditionsUseSameMarker and not self.xfade.isChecked())): + if player.playing and (not player == self and not self.conditionsUseSameMarker or (self.conditionsUseSameMarker and not self.xfade.isChecked())): player.stop() self.pause_button.setEnabled(True) self.pause_button.setChecked(False) self.stop_button.setEnabled(True) - + if self.paused and self.current == cue: - print("pause") + # print("pause") self.audio_client.send_message("/pause", 1) - self.parent().page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), - self.id) + self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}' else: - if self.sender().sender() in self.buttons: - for s in range(0, len(self.sliders)): - if s != self.buttons.index(self.sender().sender()): - self.sliders[s].setEnabled(False) - else: - self.sliders[s].setEnabled(True) + if btn != self.refbutton: + if self.sender().sender() in self.buttons: + for s, sli in enumerate(self.sliders): + if s != self.buttons.index(self.sender().sender()): + sli.setEnabled(False) + else: + sli.setEnabled(True) + + sender = 0 if self.sender().sender() not in self.buttons else self.buttons.index(self.sender().sender()) + 1 + else: + sender = 0 - sender = 0 if self.sender().sender() not in self.buttons else self.buttons.index(self.sender().sender())+1 - self.audio_client.send_message("/action", 40297) # unselect all - if type(self.tracks) == list and len(self.tracks) == len(self.buttons) + 1 and type(self.tracks[sender]) == list: + if isinstance(self.tracks, list) and len(self.tracks) == len(self.buttons) + 1 and isinstance(self.tracks[sender], list): for t in self.tracks[sender]: - self.audio_client.send_message("/track/{}/select".format(t), 1) # add t to selection + self.audio_client.send_message(f'/track/{t}/select', 1) # add t to selection self.audio_client.send_message("/action", 40341) # mute all - if type(self.tracks) == int: - self.audio_client.send_message("/track/{}/mute".format(self.tracks), 0) - elif type(self.tracks) == list and len(self.tracks) < len(self.buttons) + 1: + if isinstance(self.tracks, int): + self.audio_client.send_message(f'/track/{self.tracks}/mute', 0) + elif isinstance(self.tracks, list) and len(self.tracks) < len(self.buttons) + 1: for t in self.tracks: - self.audio_client.send_message("/track/{}/select".format(t), 1) # add t to selection + self.audio_client.send_message(f'/track/{t}/select', 1) # add t to selection self.audio_client.send_message("/action", 40280) # toggle mute for selected tracks - elif type(self.tracks[sender]) == int: - self.audio_client.send_message("/track/{}/mute".format(self.tracks[sender]), 0) + elif isinstance(self.tracks[sender], int): + self.audio_client.send_message(f'/track/{self.tracks[sender]}/mute', 0) else: self.audio_client.send_message("/action", 40280) # toggle mute for selected tracks @@ -410,8 +419,7 @@ class MUSHRA(QWidget): self.playing = True self.paused = False self.loop_button.setDisabled(True) - self.parent().page_log += "\n\t{} - (Re-)Started MUSHRA-player for cue {} {} ".format( - datetime.datetime.now().replace(microsecond=0).__str__(), self.start_cues[cue], self.id + "_" + str(cue)) + self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - (Re-)Started MUSHRA-player for cue {self.start_cues[cue]} {self.id}_{str(cue)}' def stop(self): """ @@ -429,4 +437,4 @@ class MUSHRA(QWidget): self.stop_button.setEnabled(False) self.pause_button.setEnabled(False) self.pause_button.setChecked(False) - self.parent().page_log += "\n\t{} - Stopped MUSHRA playback {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Stopped MUSHRA playback {self.id}' diff --git a/src/MessageBox.py b/src/MessageBox.py index ca5b3e48fd00b48b9d503a5a1b51e8311c34db03..1ce8e7e1bb101733aa77e77def56189c99bfa454 100644 --- a/src/MessageBox.py +++ b/src/MessageBox.py @@ -1,7 +1,6 @@ """Customized MessageBox such that the errors and warnings are more easily readable.""" -from PyQt5.QtGui import QResizeEvent -from PyQt5.QtWidgets import QMessageBox, QTextEdit +from PySide6.QtWidgets import QMessageBox, QTextEdit class ResizeMessageBox(QMessageBox): @@ -21,4 +20,4 @@ class ResizeMessageBox(QMessageBox): super(ResizeMessageBox, self).resizeEvent(event) details_box = self.findChild(QTextEdit) if details_box is not None: - details_box.setFixedSize(details_box.sizeHint().width()*2, details_box.sizeHint().height()) + details_box.setFixedSize(details_box.sizeHint().width() * 2, details_box.sizeHint().height()) diff --git a/src/OSCButton.py b/src/OSCButton.py index cba45342042ffe4f1df2a99aaaf54627878ec350..4b8a3c5d2851c65eb2e022af21e7c72de4c00808 100644 --- a/src/OSCButton.py +++ b/src/OSCButton.py @@ -5,34 +5,16 @@ import datetime from ping3 import ping from pythonosc import udp_client -from PyQt5.QtCore import QTimer, QObject -from PyQt5.QtGui import QDoubleValidator -from PyQt5.QtWidgets import QPushButton, QWidget, QHBoxLayout, QMessageBox, QSizePolicy, QLineEdit, QPlainTextEdit +from PySide6.QtCore import QTimer +from PySide6.QtGui import QDoubleValidator +from PySide6.QtWidgets import QPushButton, QWidget, QHBoxLayout, QMessageBox, QSizePolicy, QLineEdit, QPlainTextEdit from src.PasswordEntry import PasswordEntry -TIMEOUT = 0.5 +TIMEOUT = 1 class OSCButton(QWidget): - """Button with custom functionality for interacting by sending an OSC command. - - Attributes - ---------- - inscription : str - the text displayed on the button - address : str - address for the OSC command - value: str or int - value to send over OSC - parent : QObject - the page the button is on - qid : str - id of the question - receiver : (str, int), - IP + Port of the receiver - objectname : str, optional - name of the object, if it is supposed to be styled individually - """ + """Button with custom functionality for interacting by sending an OSC command.""" def __init__(self, inscription, address, value, parent, qid, receiver, objectname=None): """ @@ -67,11 +49,11 @@ class OSCButton(QWidget): if not skip and self.parent().parent().widget(s).evaluationvars is not None and \ var in self.parent().parent().widget(s).evaluationvars: self.value = self.parent().parent().widget(s).evaluationvars[var] - if type(self.value) is QLineEdit or type(self.value) is PasswordEntry: - if type(self.value.validator()) == QDoubleValidator: + if isinstance(self.value, (QLineEdit, PasswordEntry)): + if isinstance(self.value.validator(), QDoubleValidator): self.value.setText(self.value.text().replace(",", ".")) self.value = self.value.text() - elif type(self.value) is QPlainTextEdit: + elif isinstance(self.value, QPlainTextEdit): self.value = self.value.toPlainText().replace("\n", " ") if not skip and self.parent().parent().widget(s) == self.parent(): skip = True @@ -100,9 +82,9 @@ class OSCButton(QWidget): msg = QMessageBox() msg.setWindowTitle(self.parent().parent().connection_lost_title) msg.setSizeGripEnabled(True) - msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - msg.setIcon(QMessageBox.Information) - msg.setText("No connection to {}.".format(receiver[0])) + msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + msg.setIcon(QMessageBox.Icon.Information) + msg.setText(f'No connection to {receiver[0]}.') msg.exec_() if inscription is not None: @@ -114,7 +96,7 @@ class OSCButton(QWidget): self.button.clicked.connect(lambda: self.osc_client.send_message(address, self.value)) self.button.clicked.connect(self.set_used) self.button.clicked.connect(self.log) - self.button.clicked.connect(self.__click_animation) + self.button.clicked.connect(lambda: self.__click_animation(self.button)) self.setLayout(layout) def set_used(self): @@ -130,11 +112,11 @@ class OSCButton(QWidget): """ return self.used - def __click_animation(self): - __btn = self.sender() + def __click_animation(self, btn): + __btn = btn __btn.setDown(True) QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False)) def log(self): """Log Action""" - self.parent().page_log += "\n\t{} - Pressed OSC-Button {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Pressed OSC-Button {self.id}' diff --git a/src/Page.py b/src/Page.py index 432c1bc06565e27ccc61426baee2a84046f20208..8fcb8ea518bea222bad31da73ff1aabf9aaec319 100644 --- a/src/Page.py +++ b/src/Page.py @@ -3,8 +3,8 @@ Creates a structured page. """ import datetime -from PyQt5.QtCore import QSignalMapper, Qt -from PyQt5.QtWidgets import QWidget, QLabel, QFormLayout, QButtonGroup, QCheckBox, QLineEdit, QPlainTextEdit, \ +from PySide6.QtCore import QSignalMapper, Qt +from PySide6.QtWidgets import QWidget, QLabel, QFormLayout, QButtonGroup, QCheckBox, QLineEdit, QPlainTextEdit, \ QHBoxLayout from src.ABX import ABX @@ -23,25 +23,16 @@ from src.RadioMatrix import RadioMatrix class Page(QWidget): - """ - Structure for a basic page layout. + """ Structure for a basic page layout.""" - Attributes - ---------- - structure : ConfigObj - questionnaire structure - parent : QObject, optional - widget/layout this widget is embedded in - """ - - def __init__(self, structure, id, parent=None): + def __init__(self, structure, pid, parent=None): """ Parameters ---------- structure : ConfigObj questionnaire structure - id : str + pid : str name of the page parent : QObject, optional widget/layout this widget is embedded in @@ -60,7 +51,7 @@ class Page(QWidget): self.image_position = None self.image = None self.outer_layout = None - self.id = id + self.id = pid if "pupil_on_next" in structure.keys() and structure["pupil_on_next"] is not None and \ structure["pupil_on_next"] != "" and not self.parent().preview: @@ -154,11 +145,10 @@ class Page(QWidget): objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None) layout.addRow(mr) self.evaluationvars[structure[quest]["id"]] = mr.duration - for sl in range(0, len(mr.sliders)): - self.evaluationvars[structure[quest]["id"] + "_{}".format(sl + 1)] = mr.sliders[sl] + for sl, msli in enumerate(mr.sliders): + self.evaluationvars[f'{structure[quest]["id"]}_{sl + 1}'] = msli self.players.append(mr) - self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and ( - structure[quest].as_bool("required")) else False, [mr.refbutton] + mr.buttons, mr.name, mr.playing] + self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), [mr.refbutton] + mr.buttons, mr.name, mr.playing] elif structure[quest]["type"] == "Radio": ans_layout, bg = mar(structure[quest]["answers"], self, structure[quest]["id"], objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None, @@ -166,22 +156,15 @@ class Page(QWidget): lbl = QLabel(structure[quest]["text"]) layout.addRow(lbl, ans_layout) self.evaluationvars[structure[quest]["id"]] = bg - self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and ( - structure[quest].as_bool("required")) else False, lbl] + self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl] elif structure[quest]["type"] == "Check": - ans_layout, cvars = mac(structure[quest]["answers"], + ans_layout, cvars = mac(structure[quest]["answers"], structure[quest]["id"], parent=self, objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None) lbl = QLabel(structure[quest]["text"]) layout.addRow(lbl, ans_layout) - cbmapper = QSignalMapper(self) - for c in range(0, len(cvars)): - self.evaluationvars[structure[quest]["id"] + "_{}".format(c)] = cvars[c] - self.required[structure[quest]["id"] + "_{}".format(c)] = [ - True if ("required" in structure[quest].keys()) and ( - structure[quest].as_bool("required")) else False, lbl] - cvars[c].toggled.connect(cbmapper.map) - cbmapper.setMapping(cvars[c], structure[quest]["id"] + "_{}".format(c)) - cbmapper.mapped[str].connect(self.log) + for c, chck in enumerate(cvars): + self.evaluationvars[f'{structure[quest]["id"]}_{c}'] = chck + self.required[f'{structure[quest]["id"]}_{c}'] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl] elif structure[quest]["type"] == "Text": txt = matf(structure[quest].as_int("size"), structure[quest]["id"], structure[quest]["policy"] if "policy" in structure[quest].keys() else None, self, @@ -189,8 +172,7 @@ class Page(QWidget): lbl = QLabel(structure[quest]["text"]) layout.addRow(lbl, txt) self.evaluationvars[structure[quest]["id"]] = txt - self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and ( - structure[quest].as_bool("required")) else False, lbl] + self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl] elif structure[quest]["type"] == "Password": pw = PasswordEntry(structure[quest]["password_file"], structure[quest]["id"], structure[quest]["policy"] if "policy" in structure[quest].keys() else None, self, @@ -198,15 +180,14 @@ class Page(QWidget): lbl = QLabel(structure[quest]["text"]) layout.addRow(lbl, pw) self.evaluationvars[structure[quest]["id"]] = pw - self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and ( - structure[quest].as_bool("required")) else False, lbl] + self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl] elif structure[quest]["type"] == "Slider": ans_layout, slider = mas(structure[quest].as_bool("labelled"), structure[quest]["id"], structure[quest].as_float("min"), structure[quest].as_float("max"), - structure[quest].as_float("start"), structure[quest].as_float("step"), - structure[quest]["header"] if "header" in structure[quest].keys() else None, - structure[quest]["label"] if "label" in structure[quest].keys() else None, - self, + sstart=structure[quest].as_float("start"), sstep=structure[quest].as_float("step"), + header=structure[quest]["header"] if "header" in structure[quest].keys() else None, + label=structure[quest]["label"] if "label" in structure[quest].keys() else None, + parent=self, objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None) lbl = QLabel(structure[quest]["text"]) if ("question_above" in structure[quest].keys()) and structure[quest].as_bool("question_above"): @@ -221,8 +202,7 @@ class Page(QWidget): else: layout.addRow(lbl, ans_layout) self.evaluationvars[structure[quest]["id"]] = slider - self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and ( - structure[quest].as_bool("required")) else False, lbl] + self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl] elif structure[quest]["type"] == "ABX": abx = ABX(structure[quest]["start_cues"], structure[quest]["track"], structure[quest]["text"], structure[quest]["id"], @@ -230,15 +210,17 @@ class Page(QWidget): button_texts=structure[quest]["button_texts"] if "button_texts" in structure[quest].keys() else None, parent=self, objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None, - x=True if ("x" in structure[quest].keys()) and (structure[quest].as_bool("x")) else False) + x=(("x" in structure[quest].keys()) and (structure[quest].as_bool("x")))) layout.addRow(abx) self.evaluationvars[structure[quest]["id"]] = abx self.players.append(abx.a_button) self.players.append(abx.b_button) if abx.x_button is not None: self.players.append(abx.x_button) - self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and ( - structure[quest].as_bool("required")) else False, [abx.a_button, abx.b_button] if abx.x_button is None else [abx.a_button, abx.b_button, abx.x_button], abx.name, [abx.a_button.playing, abx.b_button.playing] if abx.x_button is None else [abx.a_button.playing, abx.b_button.playing, abx.x_button.playing]] + self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), + [abx.a_button, abx.b_button] if abx.x_button is None else [abx.a_button, abx.b_button, abx.x_button], + abx.name, + [abx.a_button.playing, abx.b_button.playing] if abx.x_button is None else [abx.a_button.playing, abx.b_button.playing, abx.x_button.playing]] elif structure[quest]["type"] == "Matrix": matrix = RadioMatrix(structure[quest]["questions"], structure[quest]["answers"], structure[quest]["id"], structure[quest].as_int("start_answer_id"), parent=self, @@ -246,11 +228,9 @@ class Page(QWidget): randomize=structure[quest].as_bool("randomize") if "randomize" in structure[quest].keys() else False) layout.addRow(matrix) self.evaluationvars[structure[quest]["id"]] = matrix - self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and ( - structure[quest].as_bool("required")) else False, matrix.questions, matrix.name] + self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), matrix.questions, matrix.name] else: - raise ValueError("Unknown type for question {}. Found {}. Supported types are: HLine, Player, MUSHRA, " - "Radio, Check, Text, Slider, Button".format(structure[quest]["id"], structure[quest]["type"])) + raise ValueError(f'Unknown type for question {structure[quest]["id"]}. Found {structure[quest]["type"]}. Supported types are: HLine, Player, MUSHRA, Radio, Check, Text, Slider, Button') if self.image_position == "free": if len(self.findChildren(Image)) > 0: @@ -280,63 +260,57 @@ class Page(QWidget): if len(self.players) > 0 and self.parent().popup and not self.parent().preview: for p in self.players: - if type(p) == Player and p.timer is not None: + if isinstance(p, Player) and p.timer is not None: player_found = False for item in range(self.layout().rowCount()): - if player_found and self.layout().itemAt(item, 1).widget() is None: - if type(self.layout().itemAt(item, 1)) is QHBoxLayout: - for box in range(self.layout().itemAt(item, 1).count()): - sp = self.layout().itemAt(item, 1).itemAt(box).widget().sizePolicy() + if player_found and self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() is None: + if isinstance(self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole), QHBoxLayout): + for box in range(self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).count()): + sp = self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).itemAt(box).widget().sizePolicy() sp.setRetainSizeWhenHidden(True) - self.layout().itemAt(item, 1).itemAt(box).widget().setSizePolicy(sp) - self.layout().itemAt(item, 1).itemAt(box).widget().hide() - if self.layout().itemAt(item, 0) is not None: - sp = self.layout().itemAt(item, 0).widget().sizePolicy() + self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).itemAt(box).widget().setSizePolicy(sp) + self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).itemAt(box).widget().hide() + if self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole) is not None: + sp = self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().sizePolicy() sp.setRetainSizeWhenHidden(True) - self.layout().itemAt(item, 0).widget().setSizePolicy(sp) - self.layout().itemAt(item, 0).widget().hide() - if player_found and self.layout().itemAt(item, 1).widget() is not None: - if self.layout().itemAt(item, 0) is not None: - sp = self.layout().itemAt(item, 0).widget().sizePolicy() + self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().setSizePolicy(sp) + self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().hide() + if player_found and self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() is not None: + if self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole) is not None: + sp = self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().sizePolicy() sp.setRetainSizeWhenHidden(True) - self.layout().itemAt(item, 0).widget().setSizePolicy(sp) - self.layout().itemAt(item, 0).widget().hide() - sp = self.layout().itemAt(item, 1).widget().sizePolicy() + self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().setSizePolicy(sp) + self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().hide() + sp = self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget().sizePolicy() sp.setRetainSizeWhenHidden(True) - self.layout().itemAt(item, 1).widget().setSizePolicy(sp) - self.layout().itemAt(item, 1).widget().hide() - if self.layout().itemAt(item, 1).widget() == p: + self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget().setSizePolicy(sp) + self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget().hide() + if self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() == p: player_found = True - layout.setLabelAlignment(Qt.AlignVCenter) - layout.setRowWrapPolicy(QFormLayout.WrapLongRows) # automatic line breaks in text + layout.setLabelAlignment(Qt.AlignmentFlag.AlignVCenter) + layout.setRowWrapPolicy(QFormLayout.RowWrapPolicy.WrapLongRows) # automatic line breaks in text - def log(self, qid): + def log(self, qid, sender): """Log changes Parameters ---------- qid : str id of the element that raised a log + sender : QObject + the sender of the log """ - print("Log raised", qid, type(self.sender())) - if type(self.sender()) is QLineEdit or type(self.sender()) is PasswordEntry: - self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), - qid, self.sender().text()) - elif type(self.sender()) is QPlainTextEdit: - self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), - qid, self.sender().toPlainText()) - elif type(self.sender()) is QButtonGroup: - self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), - qid, self.sender().checkedId()) - elif type(self.sender()) is QCheckBox: - self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), - qid, self.sender().isChecked()) - elif (type(self.sender()) is QSignalMapper) and (type(self.sender().sender()) is QCheckBox): # QCheckBox - self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), - qid, self.sender().sender().isChecked()) + # print("Log raised", qid, type(sender)) + if isinstance(sender, QLineEdit) or isinstance(sender, PasswordEntry): + self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.text()}' + elif isinstance(sender, QPlainTextEdit): + self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.toPlainText()}' + elif isinstance(sender, QButtonGroup): + self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.checkedId()}' + elif isinstance(sender, QSignalMapper) and isinstance(sender, QCheckBox): # QCheckBox + self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.isChecked()}' else: # Slider - self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), - qid, self.sender().value()) + self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.value()}' def get_key(self, val): """ function to return key for any value @@ -365,5 +339,4 @@ class Page(QWidget): val : str message to set """ - #self.osc_message = val - self.evaluationvars["OSCMessage_{}".format(self.id)] = val + self.evaluationvars[f'OSCMessage_{self.id}'] = val diff --git a/src/PasswordEntry.py b/src/PasswordEntry.py index e7b27955604248eeb3cfcf5ae250f216fe10ca07..292b2b66e5c57bcc7d96e74062a36c7e46bf13da 100644 --- a/src/PasswordEntry.py +++ b/src/PasswordEntry.py @@ -1,28 +1,13 @@ """A textfield of which the entry gets validated before the next page is loaded.""" -from PyQt5.QtCore import QRegExp, QLocale, QObject -from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator -from PyQt5.QtWidgets import QLineEdit +from PySide6.QtCore import QRegularExpression, QLocale +from PySide6.QtGui import QIntValidator, QDoubleValidator, QRegularExpressionValidator +from PySide6.QtWidgets import QLineEdit class PasswordEntry(QLineEdit): """A textfield of which the entry gets validated against a list of possible entries - when the user wants to go to the next page. - - Attributes - ---------- - file_passwords : str - file/path of valid entries for this field (line separated) - qid : str - id of the question - policy : list of str, optional - restricts the entry possibilities of this field; choose between "int", "double" and "regex" for the first entry, - for details see `AnswerTextField.py` - parent : QObject, optional - widget/layout this widget is embedded in - objectname : str, optional - name of the object, if it is supposed to be styled individually - """ + when the user wants to go to the next page.""" def __init__(self, file_passwords, qid, policy=None, parent=None, objectname=None): """ Parameters @@ -61,15 +46,15 @@ class PasswordEntry(QLineEdit): self.setValidator(QIntValidator(bottom=int(policy[1]), top=int(policy[2]))) elif policy[0].lower() == "double": validator = QDoubleValidator(bottom=float(policy[1]), top=float(policy[2]), decimals=int(policy[3])) - validator.setNotation(QDoubleValidator.StandardNotation) + validator.setNotation(QDoubleValidator.Notation.StandardNotation) self.setValidator(validator) if QLocale().decimalPoint() == ",": # workaround: QDoubleValidator only registers "," but not "." (depending on locale) self.textChanged.connect(lambda: self.setText(self.text().replace(".", ","))) elif policy[0].lower() == "regex": - self.setValidator(QRegExpValidator(QRegExp(policy[1]))) + self.setValidator(QRegularExpressionValidator(QRegularExpression(policy[1]))) else: - raise ValueError("Unknown validator found {}.".format(policy[0])) - self.textChanged.connect(lambda: parent.log(qid)) + raise ValueError(f'Unknown validator found {policy[0]}.') + self.textChanged.connect(lambda: parent.log(qid, self)) def validate(self): """Check if the user-given string is in the list of valid passwords.""" diff --git a/src/Player.py b/src/Player.py index 2a12b99e45d7237be757b71d1af182abb3aa290b..763fd21a26557448c7b688dbd18d6f2108960c05 100644 --- a/src/Player.py +++ b/src/Player.py @@ -4,46 +4,19 @@ Audio/Video Player Control import datetime from time import time -from PyQt5.QtCore import QTimer, QObject -from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QStyle +from PySide6.QtCore import QTimer +from PySide6.QtWidgets import QWidget, QPushButton, QHBoxLayout, QStyle, QFormLayout from src.PupilCoreButton import Button +from src.tools import player_buttons from src.Video import madmapper, vlc class Player(QWidget): - """Multi-Media player unit. - - Attributes - ---------- - start_cue : int - cue/marker number on which to start playing (e.g. in REAPER) - track : int or list<int> - active tracks (e.g. in REAPER) - video : str, optional - filename+path to the video which should be played. - qid : str - id of the question - parent : QObject, optional - widget/layout this widget is embedded in - end_cue : int, optional - cue/marker on which to stop playing (e.g. in REAPER); might be removed in future versions - displayed_buttons : list<str>, default=["Play", "Pause", "Stop"] - list of buttons which should be displayed - icons : bool, optional, default=False - if True, icons according to the functionality are displayed on the buttons - pupil : str, optional - annotation text to send to Pupil Core when the play button is clicked - objectname : str, optional - name of the object, if it is supposed to be styled individually - timer : int, optional - time in msec after which succeeding questions on the page are displayed - play_button_text : str, optional - alternate text for the play button - """ + """Multi-Media player unit.""" def __init__(self, start_cue, track, qid, video=None, parent=None, end_cue=None, - displayed_buttons=["Play", "Pause", "Stop"], icons=False, pupil=None, objectname=None, timer=None, + displayed_buttons=player_buttons, icons=False, pupil=None, objectname=None, timer=None, play_button_text=None, play_once=False, crossfade=False): """Create the layout of the player. @@ -51,7 +24,7 @@ class Player(QWidget): ---------- start_cue : int cue/marker number on which to start playing (e.g. in REAPER) - track : int or list of int + track : Union(int, list of int) active tracks (e.g. in REAPER) video : str, optional filename+path / scene name to the video which should be played. @@ -115,15 +88,15 @@ class Player(QWidget): self.timer.timeout.connect(self.timer_done) else: self.timer = None - if type(displayed_buttons) is str: + if isinstance(displayed_buttons, str): self.buttons = [displayed_buttons] # to support just one button else: self.buttons = displayed_buttons - if type(track) is str: + if isinstance(track, str): track = [int(track)] else: - for t in range(0, len(track)): - track[t] = int(track[t]) + for _, tra in enumerate(track): + tra = int(tra) self.track = track self.video = video self.start = 0 @@ -135,16 +108,16 @@ class Player(QWidget): if "Play" in self.buttons: self.play_button = QPushButton("Play" if play_button_text is None else play_button_text, None) if icons: - self.play_button.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) + self.play_button.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPlay)) self.play_button.setEnabled(True) self.play_button.clicked.connect(self.play) - self.play_button.clicked.connect(self.__click_animation) + self.play_button.clicked.connect(lambda: self.__click_animation(self.play_button)) self.play_button.setObjectName(self.objectName()) layout.addWidget(self.play_button) if "Pause" in self.buttons: self.pause_button = QPushButton("Pause", None) if icons: - self.pause_button.setIcon(self.style().standardIcon(QStyle.SP_MediaPause)) + self.pause_button.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPause)) self.pause_button.setEnabled(False) self.pause_button.setCheckable(True) self.pause_button.clicked.connect(self.pause) @@ -153,15 +126,15 @@ class Player(QWidget): if "Stop" in self.buttons: self.stop_button = QPushButton("Stop", None) if icons: - self.stop_button.setIcon(self.style().standardIcon(QStyle.SP_MediaStop)) + self.stop_button.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_MediaStop)) self.stop_button.setEnabled(False) self.stop_button.clicked.connect(self.stop) self.stop_button.setObjectName(self.objectName()) layout.addWidget(self.stop_button) self.setLayout(layout) - def __click_animation(self): - __btn = self.sender() + def __click_animation(self, btn): + __btn = btn if not self.play_once and self.button_fade > 0: __btn.setDown(True) QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False)) @@ -196,15 +169,15 @@ class Player(QWidget): self.video_client.send_message(self.video_player["unpause"][0], self.video_player["unpause"][1]) self.pause_button.setChecked(False) if str(type(self.page)) == "<class 'src.Page.Page'>": - self.page.page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}' else: - self.gui.page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}' else: for i in range(1, self.audio_tracks + 1): if i in self.track: - self.audio_client.send_message("/track/{}/mute".format(i), 0) + self.audio_client.send_message(f'/track/{i}/mute', 0) else: - self.audio_client.send_message("/track/{}/mute".format(i), 1) + self.audio_client.send_message(f'/track/{i}/mute', 1) if not self.crossfade or (self.crossfade and self.start_cue != previous_start): if int(self.start_cue) < 10: self.audio_client.send_message("/action", 40160 + int(self.start_cue)) # goto cue @@ -218,7 +191,7 @@ class Player(QWidget): elif self.crossfade and self.start_cue == previous_start and self.gui.global_play_state == "STOP": self.audio_client.send_message("/play", 1) if (self.video is not None) and (self.video_client is not None): - if "select" in self.video_player.keys(): + if "select" in self.video_player: self.video_client.send_message(self.video_player["reset"][0], self.video_player["reset"][1]) self.video_client.send_message(self.video_player["select"][0].format(self.video), self.video_player["select"][1]) self.video_client.send_message(self.video_player["play"][0], self.video_player["play"][1]) @@ -226,10 +199,9 @@ class Player(QWidget): self.video_client.send_message(self.video_player["play"][0], self.video_player["play"][1].format(self.video)) if str(type(self.page)) == "<class 'src.Page.Page'>": - self.page.page_log += "\n\t{} - (Re-)Started Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - (Re-)Started Player {self.id}' else: - self.gui.page_log += "\n\t{} - (Re-)Started Player {} ".format( - datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - (Re-)Started Player {self.id}' if (self.start != 0) and self.playing: self.end = time() self.duration.append(self.end - self.start) @@ -253,19 +225,19 @@ class Player(QWidget): self.countdown = 0 player_found = False for item in range(self.page.layout().rowCount()): - if player_found and self.page.layout().itemAt(item, 1).widget() is None: - if type(self.page.layout().itemAt(item, 1)) is QHBoxLayout: - for box in range(self.page.layout().itemAt(item, 1).count()): - self.page.layout().itemAt(item, 1).itemAt(box).widget().show() - if self.page.layout().itemAt(item, 0) is not None: - self.page.layout().itemAt(item, 0).widget().show() - if player_found and self.page.layout().itemAt(item, 1).widget() is not None: - if self.page.layout().itemAt(item, 0) is not None: - self.page.layout().itemAt(item, 0).widget().show() - self.page.layout().itemAt(item, 1).widget().show() - if type(self.page.layout().itemAt(item, 1).widget()) == Player and self.page.layout().itemAt(item, 1).widget() != self: + if player_found and self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() is None: + if isinstance(self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole), QHBoxLayout): + for box in range(self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).count()): + self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).itemAt(box).widget().show() + if self.page.layout().itemAt(item, QFormLayout.ItemRole.LabelRole) is not None: + self.page.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().show() + if player_found and self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() is not None: + if self.page.layout().itemAt(item, QFormLayout.ItemRole.LabelRole) is not None: + self.page.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().show() + self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget().show() + if isinstance(self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget(), Player) and self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() != self: player_found = False - if self.page.layout().itemAt(item, 1).widget() == self: + if self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() == self: player_found = True # self.stop() # not needed anymore @@ -278,9 +250,9 @@ class Player(QWidget): self.video_client.send_message(self.video_player["pause"][0], self.video_player["pause"][1]) self.pause_button.setChecked(True) if str(type(self.page)) == "<class 'src.Page.Page'>": - self.page.page_log += "\n\t{} - Paused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Paused Player {self.id}' else: - self.gui.page_log += "\n\t{} - Paused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Paused Player {self.id}' self.end = time() self.duration.append(self.end - self.start) self.paused = True @@ -294,9 +266,9 @@ class Player(QWidget): self.video_client.send_message(self.video_player["unpause"][0], self.video_player["unpause"][1]) self.pause_button.setChecked(False) if str(type(self.page)) == "<class 'src.Page.Page'>": - self.page.page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}' else: - self.gui.page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}' self.start = time() self.end = 0 self.paused = False @@ -323,9 +295,8 @@ class Player(QWidget): self.pause_button.setEnabled(False) self.pause_button.setChecked(False) if str(type(self.page)) == "<class 'src.Page.Page'>": - self.page.page_log += "\n\t{} - Stopped Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) - else: - self.gui.page_log += "\n\t{} - Stopped Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id) + self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Stopped Player {self.id}' + # self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Stopped Player {self.id}' if self.timer is not None and self.timer.remainingTime() > 0 and self.countdown > 0: self.timer.stop() self.playing = False diff --git a/src/PupilCoreButton.py b/src/PupilCoreButton.py index 0f1a8663f58adf93571ea0ae10f3390ce564d07d..db0e771391cb6b5e560c35731c1b5d98b6816c2c 100644 --- a/src/PupilCoreButton.py +++ b/src/PupilCoreButton.py @@ -6,30 +6,14 @@ from time import time import msgpack as serializer import zmq -from PyQt5.QtCore import Qt, QTimer, QObject -from PyQt5.QtGui import QPixmap, QDoubleValidator -from PyQt5.QtWidgets import QPushButton, QWidget, QHBoxLayout, QLabel, QDesktopWidget, QLineEdit, QPlainTextEdit +from PySide6.QtCore import QTimer +from PySide6.QtGui import QDoubleValidator +from PySide6.QtWidgets import QPushButton, QWidget, QHBoxLayout, QLineEdit, QPlainTextEdit from src.PasswordEntry import PasswordEntry class Button(QWidget): - """Button with custom functionality for interacting with Pupil Core. - - Attributes - ---------- - inscription : str - the text displayed on the button - function : str - shorthand hint for functionality - parent : QObject - the page the button is on - qid : str - id of the question - recording_name : str, optional - name for the recording folder(?) - objectname : str, optional - name of the object, if it is supposed to be styled individually - """ + """Button with custom functionality for interacting with Pupil Core.""" def __init__(self, inscription, function, parent, qid, recording_name=None, objectname=None, annotation=None): """ @@ -37,14 +21,14 @@ class Button(QWidget): Parameters ---------- - inscription : str - the text displayed on the button + inscription : Union(str, None) + the text displayed on the button, if None the Button will be invisible function : str shorthand hint for functionality parent : QObject the page the button is on - qid : str - id of the question + qid : Union(str, None) + id of the question, if None invisible Button that just triggers the function recording_name : str, optional name for the recording folder(?) objectname : str, optional @@ -80,8 +64,8 @@ class Button(QWidget): layout.addWidget(self.button) self.used = False if function == "Calibration": - self.button.clicked.connect(self.start_calibration) - elif function == "Recording": + raise NotImplementedError + if function == "Recording": self.button.clicked.connect(self.start_recording) elif function == "Stop": self.button.clicked.connect(self.stop_recording) @@ -90,7 +74,7 @@ class Button(QWidget): self.setup_annotate() self.button.clicked.connect(lambda: self.send_trigger(self.new_trigger("test" if annotation is None else str(annotation)))) self.button.clicked.connect(self.log) - self.button.clicked.connect(self.__click_animation) + self.button.clicked.connect(lambda: self.__click_animation(self.button)) self.setLayout(layout) elif function == "Annotate": # the only function that needs setup self.setup_annotate() @@ -105,31 +89,11 @@ class Button(QWidget): 'v' # get the Pupil Core software version string ''' - def __click_animation(self): - __btn = self.sender() + def __click_animation(self, btn): + __btn = btn __btn.setDown(True) QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False)) - def start_calibration(self): - """ - Start the calibration process of the Pupil Core tracking. - - Raises - ------ - zmq.ZMQError, AttributeError - If there are connection problems - """ - self.used = True - self.parent().evaluationvars[self.id] = True - try: - self.pupil_remote.send_string('C') - print("Calibrate...", self.pupil_remote.recv_string()) - if self.config_win is None: - self.config_win = Calib() - self.config_win.show() - except (zmq.ZMQError, AttributeError): - print("Couldn't connect with Pupil Capture!") - def start_recording(self): """ Start the recording process of the pupil core tracking. @@ -142,25 +106,27 @@ class Button(QWidget): self.used = True try: if self.recording_name is None: + # print("just record...") self.pupil_remote.send_string('R') else: if self.recording_name.startswith("id:"): + # print("recording name starts with id") var = self.recording_name[2:].strip(' :') skip = False for s in range(0, self.parent().parent().count()): if not skip and self.parent().parent().widget(s).evaluationvars is not None and \ var in self.parent().parent().widget(s).evaluationvars: self.recording_name = self.parent().parent().widget(s).evaluationvars[var] - if type(self.recording_name) is QLineEdit or type(self.recording_name) is PasswordEntry: - if type(self.recording_name.validator()) == QDoubleValidator: + if isinstance(self.recording_name, (QLineEdit, PasswordEntry)): + if isinstance(self.recording_name.validator(), QDoubleValidator): self.recording_name.setText(self.recording_name.text().replace(",", ".")) self.recording_name = self.recording_name.text() - elif type(self.recording_name) is QPlainTextEdit: + elif isinstance(self.recording_name, QPlainTextEdit): self.recording_name = self.recording_name.toPlainText().replace("\n", " ") if not skip and self.parent().parent().widget(s) == self.parent(): skip = True - print(self.recording_name) - self.pupil_remote.send_string('R {}'.format(self.recording_name)) + print("Recording name:",self.recording_name) + self.pupil_remote.send_string(f'R {self.recording_name}') print("Start recording...", self.pupil_remote.recv_string()) except (zmq.ZMQError, AttributeError): print("Couldn't connect with Pupil Capture!") @@ -200,7 +166,7 @@ class Button(QWidget): self.pub_socket = zmq.Socket(self.ctx, zmq.PUB) # self.pub_socket.setsockopt(zmq.LINGER, 0) # ____POLICY: set upon instantiations # self.pub_socket.setsockopt(zmq.RCVTIMEO, 2000) - self.pub_socket.connect("tcp://{}:{}".format(self.ip, pub_port)) + self.pub_socket.connect(f'tcp://{self.ip}:{pub_port}') # In order for the annotations to be correlated correctly with the rest of # the data it is required to change Pupil Capture's time base to this scripts # clock. We only set the time base once. Consider using Pupil Time Sync for @@ -209,7 +175,7 @@ class Button(QWidget): # Set Pupil Capture's time base to this scripts time. (Should be done before # starting the recording) - self.pupil_remote.send_string("T {}".format(time())) + self.pupil_remote.send_string(f'T {time()}') print("Annotate...", self.pupil_remote.recv_string()) # Start the annotations plugin @@ -279,81 +245,10 @@ class Button(QWidget): return { "topic": "annotation", "label": label, - "timestamp": time(), # time.asctime(time.localtime()); for Pupil Core > v3.4.0 NEEDS to be float + "timestamp": time(), # time.asctime(time.localtime()); for Pupil Core > v3.4.0 NEEDS to be of type float "duration": duration, } def log(self): """Log Action""" - self.parent().page_log += "\n\t{} - Pressed Button {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), - self.id) - - -class Calib(QWidget): - """ Mocking of the calibration display of Pupil Capture - - This "window" is a QWidget. If it has no parent, it will appear as a free-floating window. - - .. deprecated:: 0.1.0 - `Calib` will be removed in version 1.0.0 - - """ - - def __init__(self): - super().__init__() - self.setStyleSheet("QWidget {background-color: white;}") - self.setWindowFlags(Qt.CustomizeWindowHint | Qt.FramelessWindowHint) - sg = QDesktopWidget().screenGeometry() - self.setFixedWidth(sg.width()) - self.setFixedHeight(sg.height()) - - calibmarker = QPixmap('./Images/v0.4_calib_marker_02.jpg') - calibmarker = calibmarker.scaledToHeight(int(0.2 * sg.height())) - self.middle = QLabel(self) - self.middle.setPixmap(calibmarker) - self.middle.move(int(0.5 * sg.width() - 0.5 * calibmarker.width()), - int(0.5 * sg.height() - 0.5 * calibmarker.height())) - self.topleft = QLabel(self) - self.topleft.setPixmap(calibmarker) - self.topleft.move(0, 0) - self.topright = QLabel(self) - self.topright.setPixmap(calibmarker) - self.topright.move(int(sg.width() - calibmarker.width()), 0) - self.bottomright = QLabel(self) - self.bottomright.setPixmap(calibmarker) - self.bottomright.move(int(sg.width() - calibmarker.width()), int(sg.height() - calibmarker.height())) - self.bottomleft = QLabel(self) - self.bottomleft.setPixmap(calibmarker) - self.bottomleft.move(0, int(sg.height() - calibmarker.height())) - - stopmarker = QPixmap('./Images/v0.4_calib_marker_01.jpg') - stopmarker = stopmarker.scaledToHeight(int(0.2 * sg.height())) - self.stop = QLabel(self) - self.stop.setPixmap(stopmarker) - self.stop.move(int(0.5 * sg.width() - 0.5 * stopmarker.width()), - int(0.5 * sg.height() - 0.5 * stopmarker.height())) - self.move(0, 0) - - self.markers = [self.middle, self.topleft, self.topright, self.bottomright, self.bottomleft, self.stop] - self.show_marker(0) - - def show_marker(self, marker_no): - """Display the marker `marker_no` of `self.markers` and hide the others. - Do this for all markers and then close the window. - - Parameters - ---------- - marker_no : int - number of the marker to be displayed [0..5] - """ - # TODO display length? - for marker in range(len(self.markers)): - if self.markers[marker] != self.markers[marker_no]: - self.markers[marker].hide() - else: - self.markers[marker].show() - if marker_no + 1 < len(self.markers): - marker_no += 1 - QTimer.singleShot(1000, lambda: self.show_marker(marker_no)) - else: - QTimer.singleShot(1000, self.close) + self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Pressed Button {self.id}' diff --git a/src/QEditGui.py b/src/QEditGui.py index 1595efe269f059ede292e8743538d43f49b3e5f7..848647efde607fba08f3537192f66f7aba6bb0fa 100644 --- a/src/QEditGui.py +++ b/src/QEditGui.py @@ -6,12 +6,12 @@ from collections import deque from os.path import basename import configobj -from PyQt5 import sip -from PyQt5.QtCore import Qt, QModelIndex, QPoint -from PyQt5.QtGui import QCloseEvent, QKeySequence, QPixmap -from PyQt5.QtWidgets import QApplication, QTreeWidgetItem, QWidget, QHBoxLayout, QGroupBox, QSplitter, QFileDialog, \ - QMainWindow, QAction, QLabel, QVBoxLayout, QFormLayout, QLineEdit, QPushButton, QGridLayout, QComboBox, QCheckBox, \ - QRadioButton, QButtonGroup, QMenu, QInputDialog, QMessageBox, QLayout, QScrollArea, QDesktopWidget +import shiboken6 +from PySide6.QtCore import Qt +from PySide6.QtGui import QKeySequence, QAction, QCloseEvent +from PySide6.QtWidgets import QApplication, QTreeWidgetItem, QWidget, QHBoxLayout, QGroupBox, QSplitter, QFileDialog, \ + QMainWindow, QLabel, QVBoxLayout, QFormLayout, QLineEdit, QPushButton, QGridLayout, QComboBox, QCheckBox, \ + QRadioButton, QButtonGroup, QMenu, QInputDialog, QMessageBox, QScrollArea from configobj import ConfigObj, ConfigObjError from fpdf import FPDF @@ -19,28 +19,15 @@ from src.GUI import StackedWindowGui, VERSION from src.TextEdit import TextEdit from src.Tree import Tree from src.Validator import validate_questionnaire, listify -from src.tools import * +from src.tools import general_fields, default_values, tooltips, types, fields_per_type, video_player, randomize_options, page_fields, image_positions, policy_possibilities, player_buttons, function_possibilites class QEditGuiMain(QMainWindow): - """ Main Window, adds menu bar and status bar - - Attributes - ---------- - parent : QObject, optional - widget/layout this widget is embedded in - """ + """ Main Window, adds menu bar and status bar.""" # noinspection PyTypeChecker - def __init__(self, parent=None): - """ - - Parameters - ---------- - parent : QObject, optional - widget/layout this widget is embedded in - """ - QWidget.__init__(self, parent) + def __init__(self): + super().__init__() menu = self.menuBar() file = menu.addMenu("File") new = QAction("New", self) @@ -106,12 +93,12 @@ class QEditGuiMain(QMainWindow): self.setCentralWidget(self.gui) self.setWindowTitle("Questionnaire Editor") self.move(0, 0) - # self.showMaximized() + self.showMaximized() self.show() def run_validation(self): """Make sure that the current variable is saved and then run validation.""" - if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit): + if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)): QApplication.focusWidget().clearFocus() validate_questionnaire(listify(self.structure, self.status, self.status_duration)) @@ -126,50 +113,53 @@ class QEditGuiMain(QMainWindow): value of the button clicked (True if it is supposed to be saved) """ msg = QMessageBox() - msg.setIcon(QMessageBox.Question) + msg.setIcon(QMessageBox.Icon.Question) msg.setText("The questionnaire file has changed. Do you want to save it?") msg.setWindowFlags(Qt.CustomizeWindowHint) # removes title bar - msg.addButton("Yes", QMessageBox.AcceptRole) - msg.addButton("No", QMessageBox.RejectRole) - retval = msg.exec_() + msg.addButton("Yes", QMessageBox.ButtonRole.AcceptRole) + msg.addButton("No", QMessageBox.ButtonRole.RejectRole) + msg.exec() + retval = msg.buttonRole(msg.clickedButton()) return retval - def closeEvent(self, a0): + def closeEvent(self, event): """Check for unsaved changes before quitting. (When the red x is pressed.) Parameters ---------- - a0 : QCloseEvent + event : QCloseEvent """ - self.quit_editor() + if isinstance(event, QCloseEvent): + self.quit_editor() def quit_editor(self): """Check for unsaved changes before quitting.""" - QApplication.focusWidget().clearFocus() + if QApplication.focusWidget() is not None: + QApplication.focusWidget().clearFocus() if self.initial_structure is not None and self.initial_structure != copy.deepcopy( dict(listify(self.structure))) and len(self.undo_stack) > 0 \ and not ( self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0): - if self.unsaved_message() == QMessageBox.AcceptRole: + if self.unsaved_message() == QMessageBox.ButtonRole.AcceptRole: self.save() self.close() def export(self): """Export GUI to pdf by taking screenshots of every page and combining them.""" - if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit): + if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)): QApplication.focusWidget().clearFocus() if self.filename is None: self.structure.filename = "./tmp.txt" self.structure.encoding = "utf-8" - self.structure.initial_comment = ["Created with QUEST version {}".format(VERSION)] + self.structure.initial_comment = [f'Created with QUEST version {VERSION}.'] self.structure.write() self.status.showMessage("Exporting to pdf...", self.status_duration) exgui = StackedWindowGui(self.structure.filename, preview=True) - exgui.children()[1].setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # this is the ScrollArea - exgui.children()[1].setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # this is the ScrollArea + exgui.children()[1].setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) # this is the ScrollArea + exgui.children()[1].setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) # this is the ScrollArea rec_size = exgui.children()[1].children()[0].children()[0].children()[0].sizeHint() # this is the Page object exgui.resize(max(exgui.width(), rec_size.width()), max(exgui.height(), rec_size.height())) - pdf = None#FPDF() + pdf = None for page in range(exgui.Stack.count()): exgui.Stack.setCurrentIndex(page) if page + 1 == exgui.Stack.count(): # last page @@ -177,9 +167,9 @@ class QEditGuiMain(QMainWindow): p = exgui.grab() w = p.width() h = p.height() - p.save("./Page_{}.png".format(page)) + p.save(f'./Page_{page}.png') if pdf is None: - pdf = FPDF(format=(w,h)) + pdf = FPDF(format=(w, h)) '''if w > h: pdf.add_page(orientation='L') pdf.image("./Page_{}.png".format(page), x=0, y=0)#, w=297) @@ -188,7 +178,7 @@ class QEditGuiMain(QMainWindow): pdf.image("./Page_{}.png".format(page), x=0, y=0)#, h=297) ''' pdf.add_page() - pdf.image("./Page_{}.png".format(page), x=0, y=0, w=w, h=h) + pdf.image(f'./Page_{page}.png', x=0, y=0, w=w, h=h) exgui.close() file = QFileDialog().getSaveFileName(self, caption="Save PDF-File", filter="pdf files (*.pdf)")[0] if file is not None and file != "": @@ -197,7 +187,7 @@ class QEditGuiMain(QMainWindow): else: self.status.showMessage("Export aborted.", self.status_duration) for page in range(exgui.Stack.count()): - os.remove("./Page_{}.png".format(page)) + os.remove(f'./Page_{page}.png') if self.structure.filename == "./tmp.txt": os.remove("./tmp.txt") @@ -205,9 +195,8 @@ class QEditGuiMain(QMainWindow): """Create a new file structure.""" if self.initial_structure is not None and self.initial_structure != copy.deepcopy( dict(listify(self.structure))) and len(self.undo_stack) > 0 \ - and not ( - self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0): - if self.unsaved_message() == QMessageBox.AcceptRole: + and not (self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0): + if self.unsaved_message() == QMessageBox.ButtonRole.AcceptRole: self.save() self.undo_stack.clear() self.redo_stack.clear() @@ -232,28 +221,27 @@ class QEditGuiMain(QMainWindow): """ if self.initial_structure is not None and ( self.initial_structure != copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) > 0) \ - and not ( - self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0): - if self.unsaved_message() == QMessageBox.AcceptRole: + and not (self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0): + if self.unsaved_message() == QMessageBox.ButtonRole.AcceptRole: self.save() dlg = QFileDialog(self) - dlg.setFileMode(QFileDialog.ExistingFile) + dlg.setFileMode(QFileDialog.FileMode.ExistingFile) dlg.setNameFilter("Text files (*.txt)") dlg.setStyle(self.style()) - if dlg.exec_(): + if dlg.exec(): file = dlg.selectedFiles()[0] self.filename = file try: self.status.clearMessage() + self.status.showMessage(f'Loading {self.filename}.', self.status_duration) self.structure = ConfigObj(file) - if len(self.structure.initial_comment) > 0: - print(self.structure.initial_comment[0].rsplit(' ', 1)[1]) self.initial_structure = copy.deepcopy(dict(self.structure)) self.gui.create_tree(self.structure) self.undoaction.setEnabled(False) self.redoaction.setEnabled(False) self.undo_stack.clear() self.redo_stack.clear() + self.status.clearMessage() except ConfigObjError: self.status.showMessage("Tried to load a file with an invalid structure.", self.status_duration) if self.load_preview.isChecked(): @@ -267,7 +255,7 @@ class QEditGuiMain(QMainWindow): def save(self): """Save current structure with current name.""" - if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit): + if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)): QApplication.focusWidget().clearFocus() self.structure = listify(self.structure, self.status, self.status_duration) if self.structure.filename is None or self.structure.filename == "./tmp.txt": @@ -275,18 +263,17 @@ class QEditGuiMain(QMainWindow): else: self.structure.filename = self.filename self.structure.encoding = "utf-8" - self.structure.initial_comment = ["Created with QUEST version {}".format(VERSION)] + self.structure.initial_comment = [f'Created with QUEST version {VERSION}.'] self.structure.write() self.initial_structure = copy.deepcopy(dict(self.structure)) self.status.clearMessage() - self.undo_stack.clear() - self.redo_stack.clear() + #self.undo_stack.clear() + #self.redo_stack.clear() self.status.showMessage("Saved structure.", self.status_duration) def saveas(self): """Save current structure as .txt file.""" - if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit): - # QLineEdit().editingFinished() + if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)): QApplication.focusWidget().clearFocus() self.structure = listify(self.structure, self.status, self.status_duration) file = QFileDialog().getSaveFileName(self, caption="Save File", filter="Text files (*.txt)")[0] @@ -294,13 +281,13 @@ class QEditGuiMain(QMainWindow): self.filename = file self.structure.filename = file self.structure.encoding = "utf-8" - self.structure.initial_comment = ["Created with QUEST version {}".format(VERSION)] + self.structure.initial_comment = [f'Created with QUEST version {VERSION}.'] self.structure.write() self.initial_structure = copy.deepcopy(dict(self.structure)) self.status.clearMessage() - self.undo_stack.clear() - self.redo_stack.clear() - self.status.showMessage("Saved structure as {}".format(file), self.status_duration) + #self.undo_stack.clear() + #self.redo_stack.clear() + self.status.showMessage(f'Saved structure as {file}.', self.status_duration) self.gui.treeview.topLevelItem(0).setText(0, os.path.basename(file)) else: self.status.clearMessage() @@ -350,7 +337,7 @@ class EditGui(QWidget): self.treeview = Tree(self) self.treeview.clicked.connect(self.show_details) self.treeview.itemSelectionChanged.connect(self.change_active_buttons) - self.treeview.setContextMenuPolicy(Qt.CustomContextMenu) + self.treeview.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.treeview.customContextMenuRequested.connect(self.open_tree_menu) self.treeview.tree_changed.connect(self.update_structure) self.treeview.error_message.connect(self.set_status_message) @@ -363,6 +350,7 @@ class EditGui(QWidget): self.questiontype = QComboBox() self.questiontype.addItems(types) self.questiontype.setToolTip(tooltips["type"]) + self.questiontype.setObjectName("questiontype") self.questiontype.hide() self.questiontype.activated.connect(self.update_val) self.qss_filechooser = QPushButton("Choose file...") @@ -443,7 +431,7 @@ class EditGui(QWidget): self.prev_refresh_layout = QHBoxLayout() self.refresh_button = QPushButton("Refresh Preview") self.refresh_button.clicked.connect(self.load_preview) - self.prev_refresh_layout.addWidget(self.refresh_button, alignment=Qt.AlignRight | Qt.AlignBottom) + self.prev_refresh_layout.addWidget(self.refresh_button, alignment=Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignBottom) self.automatic_refresh = QCheckBox("automatic refresh") self.prev_refresh_layout.addWidget(self.automatic_refresh) self.prev_layout.addLayout(self.prev_refresh_layout) @@ -451,21 +439,22 @@ class EditGui(QWidget): scroll = QScrollArea() scroll.setWidget(edit) scroll.setWidgetResizable(True) - scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) scroll.setStyleSheet("QScrollArea{border: 1px solid transparent;}") splitter.addWidget(structure_view) splitter.addWidget(scroll) splitter.addWidget(preview) layout.addWidget(splitter) + splitter.setSizes([int(self.width()/3), int(self.width()/3), int(self.width()/3)]) self.setLayout(layout) def choose_qss(self): """Choose an existing qss/css file as stylesheet.""" dlg = QFileDialog(self) - dlg.setFileMode(QFileDialog.ExistingFile) + dlg.setFileMode(QFileDialog.FileMode.ExistingFile) dlg.setNameFilter("QSS/CSS files (*.qss *.css)") dlg.setStyle(self.style()) - if dlg.exec_(): + if dlg.exec(): self.qss_filename.setText(dlg.selectedFiles()[0]) if self.parent().structure["stylesheet"] != self.qss_filename.text(): self.parent().undo_stack.append(copy.deepcopy(dict(self.parent().structure))) @@ -479,10 +468,10 @@ class EditGui(QWidget): def choose_pwfile(self): """Choose an existing txt file as password file.""" dlg = QFileDialog(self) - dlg.setFileMode(QFileDialog.ExistingFile) + dlg.setFileMode(QFileDialog.FileMode.ExistingFile) dlg.setNameFilter("Password files (*.txt)") dlg.setStyle(self.style()) - if dlg.exec_(): + if dlg.exec(): self.pw_file.setText(dlg.selectedFiles()[0]) page = self.treeview.selectedItems()[0].parent().text(0) question = self.treeview.selectedItems()[0].text(0) @@ -496,10 +485,10 @@ class EditGui(QWidget): def choose_imgfile(self): """Choose an existing image file.""" dlg = QFileDialog(self) - dlg.setFileMode(QFileDialog.ExistingFile) + dlg.setFileMode(QFileDialog.FileMode.ExistingFile) dlg.setNameFilter("Image files (*.png *.jpg *.jpeg *.gif)") dlg.setStyle(self.style()) - if dlg.exec_(): + if dlg.exec(): self.img_file.setText(dlg.selectedFiles()[0]) page = self.treeview.selectedItems()[0].parent().text(0) question = self.treeview.selectedItems()[0].text(0) @@ -513,10 +502,10 @@ class EditGui(QWidget): def choose_randfile(self): """Choose an existing txt file as randomization order file.""" dlg = QFileDialog(self) - dlg.setFileMode(QFileDialog.ExistingFile) + dlg.setFileMode(QFileDialog.FileMode.ExistingFile) dlg.setNameFilter("Randomization files (*.txt *.csv)") dlg.setStyle(self.style()) - if dlg.exec_(): + if dlg.exec(): self.rand_file.setText(dlg.selectedFiles()[0]) if self.parent().structure["randomization_file"] != self.rand_file.text(): self.parent().undo_stack.append(copy.deepcopy(dict(self.parent().structure))) @@ -533,18 +522,18 @@ class EditGui(QWidget): file : str, optional, default=None name/path of the config file, use None for previewing an unsaved structure. """ - if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit): + if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)): self.edit_done() + self.parent().save() error_found, _, _ = validate_questionnaire( listify(self.parent().structure, self.parent().status, self.parent().status_duration), suppress=True) if not error_found and len(self.parent().structure.sections) > 0: self.clear_layout(self.prev_widget) if file is None or not file: - if not file and (self.parent().structure.filename is None or file == "./tmp.txt" or - self.parent().structure.filename == "./tmp.txt"): + if not file and (self.parent().structure.filename is None or file == "./tmp.txt" or self.parent().structure.filename == "./tmp.txt"): self.parent().structure.filename = "./tmp.txt" self.parent().structure.encoding = "utf-8" - self.parent().structure.initial_comment = ["Created with QUEST version {}".format(VERSION)] + self.parent().structure.initial_comment = [f'Created with QUEST version {VERSION}.'] self.parent().structure.write() file = "./tmp.txt" else: @@ -624,7 +613,7 @@ class EditGui(QWidget): page = QTreeWidgetItem(root, [sec]) for q in structure[sec].sections: quest = QTreeWidgetItem(page, [q]) - quest.setFlags(quest.flags() & ~Qt.ItemIsDropEnabled) + quest.setFlags(quest.flags() & ~Qt.ItemFlag.ItemIsDropEnabled) self.treeview.addTopLevelItem(root) else: root = QTreeWidgetItem(self.treeview, ["<new questionnaire>"]) @@ -653,8 +642,7 @@ class EditGui(QWidget): if field == "go_back": val_field = QCheckBox("") val_field.toggled.connect(self.update_val) - val_field.setChecked(True if ((self.parent().structure[field] == "True") or ( - type(self.parent().structure["go_back"]) is bool and self.parent().structure["go_back"])) else False) + val_field.setChecked(True if ((self.parent().structure[field] == "True") or (isinstance(self.parent().structure["go_back"], bool) and self.parent().structure["go_back"])) else False) elif field == "save_message": val_field = TextEdit(self.parent().structure[field] if field in self.parent().structure.keys() else "") val_field.editingFinished.connect(self.edit_done) @@ -664,7 +652,7 @@ class EditGui(QWidget): if current_pages: self.save_after.addItems(current_pages) selected = current_pages.index(self.parent().structure[field]) if (field in self.parent().structure.keys() and self.parent().structure[field] in current_pages) else -1 - self.save_after.setCurrentIndex(selected if selected > -1 else len(current_pages)-1) + self.save_after.setCurrentIndex(selected if selected > -1 else len(current_pages) - 1) self.parent().structure[field] = self.save_after.currentText() self.save_after.show() elif field == "stylesheet": @@ -699,7 +687,6 @@ class EditGui(QWidget): elif field == "video_player": val_field = QComboBox() val_field.addItems(video_player) - print(self.parent().structure[field]) val_field.setCurrentIndex(video_player.index(self.parent().structure[field])) val_field.activated.connect(self.update_val) else: @@ -707,18 +694,17 @@ class EditGui(QWidget): if field in self.parent().structure.keys(): val_field.setText(str(self.parent().structure[field])) val_field.editingFinished.connect(self.edit_done) - if field == "back_text" and (("go_back" in self.parent().structure.keys()) and - ((self.parent().structure["go_back"] == "False") or ( - type(self.parent().structure["go_back"]) is bool and not self.parent().structure["go_back"]))): + if field == "back_text" and (("go_back" in self.parent().structure.keys()) and ((self.parent().structure["go_back"] == "False") or ( + isinstance(self.parent().structure["go_back"], bool) and not self.parent().structure["go_back"]))): val_field.setDisabled(True) self.edit_layout.addRow(QLabel(field), val_field) - if type(val_field) != QHBoxLayout: + if not isinstance(val_field, QHBoxLayout): val_field.setToolTip(tooltips[field]) elif (val.parent().data() is not None) and (val.parent().parent().data() is None): # page if self.parent().structure[val.data()]: for k in page_fields: val_field = None - if k == "title" or k == "randomgroup" or k == "pupil_on_next": + if k in ["title", "randomgroup", "pupil_on_next"]: val_field = QLineEdit(self.parent().structure[val.data()][k] if k in self.parent().structure[val.data()] else "") val_field.editingFinished.connect(self.edit_done) elif k == "description": @@ -764,12 +750,14 @@ class EditGui(QWidget): self.img_layout.addWidget(self.img_file) elif fields_per_type[question_data[k]][0][field] == "QPlainTextEdit": if field not in question_data.keys(): - val_field = TextEdit("") + val_field = TextEdit() + val_field.setText("") else: - val_field = TextEdit(str(question_data[field])) + val_field = TextEdit() + val_field.setText(str(question_data[field])) val_field.editingFinished.connect(self.edit_done) if (field == "label") and ((question_data["labelled"] == "False") or ( - type(question_data["labelled"]) is bool and not question_data["labelled"])): + isinstance(question_data["labelled"], bool) and not question_data["labelled"])): val_field.setDisabled(True) elif fields_per_type[question_data[k]][0][field] == "QComboBox": if field == "receiver": @@ -815,14 +803,12 @@ class EditGui(QWidget): self.clear_layout(self.policy_layout) if question_data[field] == "free": self.policy_layout.addWidget(QLabel("x_pos")) - ann_field = QLineEdit(str(question_data[ - "x_pos"]) if "x_pos" in question_data.keys() else "") + ann_field = QLineEdit(str(question_data["x_pos"]) if "x_pos" in question_data.keys() else "") ann_field.setObjectName("x_pos") self.policy_layout.addWidget(ann_field) ann_field.editingFinished.connect(self.edit_done) self.policy_layout.addWidget(QLabel("y_pos")) - ann_field = QLineEdit(str(question_data[ - "y_pos"]) if "y_pos" in question_data.keys() else "") + ann_field = QLineEdit(str(question_data["y_pos"]) if "y_pos" in question_data.keys() else "") ann_field.setObjectName("y_pos") self.policy_layout.addWidget(ann_field) ann_field.editingFinished.connect(self.edit_done) @@ -921,9 +907,9 @@ class EditGui(QWidget): bg.addButton(rb, cnt) bg.buttonClicked.connect(self.update_val) cnt += 1 - if type(val_field) != QHBoxLayout: + if not isinstance(val_field, QHBoxLayout): val_field.setToolTip(tooltips[field]) - if field == "policy" or field == "annotation" or field == "recording_name" or field == "function" or field == "image_position": + if field in ["policy", "annotation", "recording_name", "function", "image_position"]: self.edit_layout.addRow(QLabel(field), val_field) self.edit_layout.addRow(self.policy_layout) elif field == "password_file": @@ -945,22 +931,20 @@ class EditGui(QWidget): self.parent().undoaction.setEnabled(True) self.parent().redo_stack.clear() self.parent().redoaction.setEnabled(False) - if type(self.sender()) is QButtonGroup: + if isinstance(self.sender(), QButtonGroup): lbl = self.sender().parent().parent().layout().labelForField(self.sender().parent().layout()).text() new_val = self.sender().checkedId() if lbl == "size": if self.sender().checkedId(): # multiline - pos = \ - self.sender().parent().parent().layout().getLayoutPosition(self.sender().parent().layout())[0] + 1 - self.sender().parent().parent().layout().itemAt(pos, 1).widget().setEnabled(False) - self.sender().parent().parent().layout().itemAt(pos, 1).widget().setCurrentIndex(0) + pos = self.sender().parent().parent().layout().getLayoutPosition(self.sender().parent().layout())[0] + 1 + self.sender().parent().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setEnabled(False) + self.sender().parent().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setCurrentIndex(0) self.clear_layout(self.policy_layout) else: - pos = \ - self.sender().parent().parent().layout().getLayoutPosition(self.sender().parent().layout())[0] + 1 - self.sender().parent().parent().layout().itemAt(pos, 1).widget().setEnabled(True) + pos = self.sender().parent().parent().layout().getLayoutPosition(self.sender().parent().layout())[0] + 1 + self.sender().parent().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setEnabled(True) self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["policy"] = \ - self.sender().parent().parent().layout().itemAt(pos, 1).widget().currentText() + self.sender().parent().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().currentText() self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["policy"] = ["None"] new_val += 1 elif lbl == "buttons": @@ -968,17 +952,17 @@ class EditGui(QWidget): for btn in self.sender().buttons(): if btn.isChecked(): new_val.append(player_buttons[self.sender().buttons().index(btn)]) - elif type(self.sender().parent().layout()) != QVBoxLayout: + elif not isinstance(self.sender().parent().layout(), QVBoxLayout): lbl = self.sender().parent().layout().labelForField(self.sender()).text() - if type(self.sender()) is QCheckBox: - if (lbl == "go_back") or (lbl == "labelled"): + if isinstance(self.sender(), QCheckBox): + if lbl in ["go_back", "labelled"]: if new_val: pos = self.sender().parent().layout().getWidgetPosition(self.sender())[0] + 1 - self.sender().parent().layout().itemAt(pos, 1).widget().setEnabled(True) + self.sender().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setEnabled(True) else: pos = self.sender().parent().layout().getWidgetPosition(self.sender())[0] + 1 - self.sender().parent().layout().itemAt(pos, 1).widget().setEnabled(False) - elif type(self.sender()) is QComboBox: + self.sender().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setEnabled(False) + elif isinstance(self.sender(), QComboBox): if self.sender().objectName() == "receiver": self.sender().parent().layout().itemAt(1).widget().layout().itemAt(1).widget().setEnabled(False) self.sender().parent().layout().itemAt(1).widget().layout().itemAt(3).widget().setEnabled(False) @@ -1079,12 +1063,12 @@ class EditGui(QWidget): new_val = self.sender().currentText() # add all needed fields for the new type, keep values of fields if already present for field in fields_per_type[new_val][0].keys(): - if field in default_values.keys() and \ + if field in default_values and \ field not in self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]: self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)][field] = default_values[field] # remove no longer valid fields for field in self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)].keys(): - if field not in fields_per_type[new_val][0].keys(): + if field not in fields_per_type[new_val][0]: self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)].pop(field) # update the value just changed @@ -1136,38 +1120,28 @@ class EditGui(QWidget): new_val[1] = self.sender().text() if len(new_val) > 1 else new_val.append(self.sender().text()) elif self.sender().objectName() == "anno": new_val = self.sender().text() - self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["annotation"] = new_val + self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["annotation"] = new_val elif self.sender().objectName() == "rec": new_val = self.sender().text() - self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["recording_name"] = new_val + self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["recording_name"] = new_val elif self.sender().objectName() == "x_pos": new_val = self.sender().text() - self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["x_pos"] = new_val + self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["x_pos"] = new_val elif self.sender().objectName() == "y_pos": new_val = self.sender().text() - self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["y_pos"] = new_val + self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["y_pos"] = new_val elif self.sender().objectName() == "rec_ip": new_val = self.sender().text() - if len(self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["receiver"]) > 0: - self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["receiver"][0] = new_val + if len(self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"]) > 0: + self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"][0] = new_val else: - self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["receiver"] = [new_val, ""] + self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"] = [new_val, ""] elif self.sender().objectName() == "rec_port": new_val = self.sender().text() - if len(self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["receiver"]) > 0: - self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["receiver"][1] = new_val + if len(self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"]) > 0: + self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"][1] = new_val else: - self.parent().structure[self.treeview.currentItem().parent().text(0)][ - self.treeview.currentItem().text(0)]["receiver"] = ["", new_val] + self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"] = ["", new_val] if self.automatic_refresh.isChecked(): self.load_preview() @@ -1181,12 +1155,13 @@ class EditGui(QWidget): value of the button clicked (True if it is supposed to be updated) """ msg = QMessageBox() - msg.setIcon(QMessageBox.Question) - msg.setText('The current value of "save_after" is "{}". Do you want to change it to the new page ({})?'.format(self.save_after.currentText(), new_page)) + msg.setIcon(QMessageBox.Icon.Question) + msg.setText(f'The current value of "save_after" is "{self.save_after.currentText()}". Do you want to change it to the new page ({new_page})?') msg.setWindowFlags(Qt.CustomizeWindowHint) # removes title bar - msg.addButton("Yes", QMessageBox.AcceptRole) - msg.addButton("No", QMessageBox.RejectRole) - retval = msg.exec_() + msg.addButton("Yes", QMessageBox.ButtonRole.AcceptRole) + msg.addButton("No", QMessageBox.ButtonRole.RejectRole) + msg.exec() + retval = msg.buttonRole(msg.clickedButton()) return retval def clear_layout(self, layout): @@ -1198,7 +1173,7 @@ class EditGui(QWidget): the layout to be cleared """ while layout.count(): - if type(layout) == QFormLayout: + if isinstance(layout, QFormLayout): trr = layout.takeRow(0) child = trr.fieldItem lbl = trr.labelItem @@ -1206,11 +1181,7 @@ class EditGui(QWidget): lbl.widget().deleteLater() else: child = layout.takeAt(0) - if child.widget() and (not child.widget() == self.questiontype) and \ - (not child.widget() == self.qss_filechooser) and (not child.widget() == self.qss_filename)\ - and (not child.widget() == self.pw_file) and (not child.widget() == self.save_after) and\ - (not child.widget() == self.img_file) and\ - (not child.widget() == self.rand_file) and (not child.widget() == self.rand_filechooser): + if child.widget() and child.widget() not in [self.questiontype, self.qss_filechooser, self.qss_filename, self.pw_file, self.save_after, self.img_file, self.rand_file, self.rand_filechooser]: child.widget().deleteLater() elif child.widget() == self.questiontype: self.questiontype.hide() @@ -1303,7 +1274,7 @@ class EditGui(QWidget): paste_quest.triggered.connect(lambda: self.paste(self.treeview.itemAt(position))) menu.addAction(paste_quest) if menu is not None: - menu.exec_(self.treeview.viewport().mapToGlobal(position)) + menu.exec(self.treeview.viewport().mapToGlobal(position)) def copy(self, node, copy_type): """Copy a page or question. @@ -1341,7 +1312,7 @@ class EditGui(QWidget): pasted = False before = copy.deepcopy(dict(self.parent().structure)) if self.copied[0] is not None: - if item is None or type(item) is bool: + if item is None or isinstance(item, bool): item = self.current_item if item is not None: if (item.parent() is None and self.copied[1] != "page") or (item.parent() is not None and item.text(0) not in self.parent().structure.sections and self.copied[1] != "question"): @@ -1372,10 +1343,10 @@ class EditGui(QWidget): data : configobj.Section, default=None not None when adding a page by copy+paste """ - text, ok = QInputDialog.getText(self, "New page", "Name of the new page:", QLineEdit.Normal) + text, ok = QInputDialog.getText(self, "New page", "Name of the new page:", QLineEdit.EchoMode.Normal) if ok and text not in self.parent().structure.keys() and text != '': self.treeview.expandItem(self.treeview.itemAt(0, 0)) - if data is None or type(data) != configobj.Section: + if data is None or not isinstance(data, configobj.Section): self.parent().undo_stack.append( copy.deepcopy(dict(self.parent().structure))) self.parent().undoaction.setEnabled(True) @@ -1390,7 +1361,7 @@ class EditGui(QWidget): self.parent().structure["save_after"] = text else: new_val = self.change_save_after_message(text) - if new_val == QMessageBox.AcceptRole: + if new_val == QMessageBox.ButtonRole.AcceptRole: self.parent().structure["save_after"] = text else: page = QTreeWidgetItem(self.treeview.itemAt(0, 0), self.treeview.currentItem()) @@ -1404,19 +1375,18 @@ class EditGui(QWidget): for quest in data.sections: _ = QTreeWidgetItem(page, [quest]) new_val = self.change_save_after_message(text) - if new_val == QMessageBox.AcceptRole: + if new_val == QMessageBox.ButtonRole.AcceptRole: self.parent().structure["save_after"] = text self.update_structure() self.treeview.setCurrentItem(page) self.show_details(self.treeview.indexFromItem(page)) - if self.automatic_refresh.isChecked() and (data is None or type(data) != configobj.Section): + if self.automatic_refresh.isChecked() and (data is None or not isinstance(data, configobj.Section)): self.load_preview() elif text in self.parent().structure.keys(): if text in general_fields: - self.set_status_message( - "Cannot create page named {}. A general field is already named that.".format(text)) + self.set_status_message(f'Cannot create page named {text}. A general field is already named that.') else: - self.set_status_message("Page {} already exists.".format(text)) + self.set_status_message(f'Page {text} already exists.') else: self.set_status_message("Add page aborted.") @@ -1430,7 +1400,7 @@ class EditGui(QWidget): data : configObj.Section, default=None not None when adding a page by copy+paste """ - text, ok = QInputDialog.getText(self, "New question", "Name of the new question:", QLineEdit.Normal) + text, ok = QInputDialog.getText(self, "New question", "Name of the new question:", QLineEdit.EchoMode.Normal) if ok and text not in self.parent().structure[page.text(0)].keys() and text != '': self.treeview.expandItem(page) if data is None: @@ -1440,13 +1410,13 @@ class EditGui(QWidget): self.parent().redoaction.setEnabled(False) self.parent().structure[page.text(0)][text] = {} quest = QTreeWidgetItem(page, [text]) - quest.setFlags(quest.flags() & ~Qt.ItemIsDropEnabled) + quest.setFlags(quest.flags() & ~Qt.ItemFlag.ItemIsDropEnabled) new_question = {"type": "HLine"} self.parent().structure[page.text(0)][text] = new_question else: quest = QTreeWidgetItem(page, self.treeview.currentItem()) quest.setText(0, text) - quest.setFlags(quest.flags() & ~Qt.ItemIsDropEnabled) + quest.setFlags(quest.flags() & ~Qt.ItemFlag.ItemIsDropEnabled) new_question = data.copy() self.parent().structure[page.text(0)][text] = new_question # data self.update_structure() @@ -1456,10 +1426,9 @@ class EditGui(QWidget): self.load_preview() elif text in self.parent().structure[page.text(0)].keys(): if text in page_fields: - self.set_status_message( - "Cannot create question named {}. A general field is already named that.".format(text)) + self.set_status_message(f'Cannot create question named {text}. A general field is already named that.') else: - self.set_status_message("Question {} already exists.".format(text)) + self.set_status_message(f'Question {text} already exists.') else: self.set_status_message("Add question aborted.") @@ -1478,7 +1447,7 @@ class EditGui(QWidget): self.parent().structure.pop(item.text(0)) if "save_after" in self.parent().structure.keys() and self.parent().structure["save_after"] == item.text(0): self.parent().structure["save_after"] = None - sip.delete(item) # delete AFTER last ref! + shiboken6.delete(item) # delete AFTER last ref! self.treeview.clearSelection() self.current_item = None self.clear_layout(self.edit_layout) @@ -1498,7 +1467,7 @@ class EditGui(QWidget): self.parent().redo_stack.clear() self.parent().redoaction.setEnabled(False) self.parent().structure[item.parent().text(0)].pop(item.text(0)) - sip.delete(item) # delete AFTER last ref! + shiboken6.delete(item) # delete AFTER last ref! self.clear_layout(self.edit_layout) self.treeview.clearSelection() self.current_item = None @@ -1513,7 +1482,7 @@ class EditGui(QWidget): item : QTreeWidgetItem the page to be renamed """ - text, ok = QInputDialog.getText(self, "Rename page", "New name for the page:", QLineEdit.Normal) + text, ok = QInputDialog.getText(self, "Rename page", "New name for the page:", QLineEdit.EchoMode.Normal) if ok and text not in self.parent().structure.keys() and text != '': self.parent().undo_stack.append(copy.deepcopy(dict(self.parent().structure))) self.parent().undoaction.setEnabled(True) @@ -1525,10 +1494,9 @@ class EditGui(QWidget): self.show_details(self.treeview.indexFromItem(item)) elif text in self.parent().structure.keys(): if text in general_fields: - self.set_status_message( - "Cannot rename page to {}. A general field is already named that.".format(text)) + self.set_status_message(f'Cannot rename page to {text}. A general field is already named that.') else: - self.set_status_message("Page {} already exists.".format(text)) + self.set_status_message(f'Page {text} already exists.') else: self.set_status_message("Add page aborted.") @@ -1540,7 +1508,7 @@ class EditGui(QWidget): item : QTreeWidgetItem the question to be renamed """ - text, ok = QInputDialog.getText(self, "Rename question", "New name for the question:", QLineEdit.Normal) + text, ok = QInputDialog.getText(self, "Rename question", "New name for the question:", QLineEdit.EchoMode.Normal) if ok and text not in self.parent().structure[item.parent().text(0)].keys() and text != '': self.parent().undo_stack.append(copy.deepcopy(dict(self.parent().structure))) self.parent().undoaction.setEnabled(True) @@ -1552,10 +1520,9 @@ class EditGui(QWidget): self.show_details(self.treeview.indexFromItem(item)) elif text in self.parent().structure[item.parent().text(0)].keys(): if text in page_fields: - self.set_status_message( - "Cannot rename question to {}. A general field is already named that.".format(text)) + self.set_status_message(f'Cannot rename question to {text}. A general field is already named that.') else: - self.set_status_message("Question {} already exists.".format(text)) + self.set_status_message(f'Question {text} already exists.') else: self.set_status_message("Add question aborted.") @@ -1585,12 +1552,12 @@ class EditGui(QWidget): if pages != self.parent().structure.sections: # TODO Testcases - for page_no in range(len(pages)): + for page_no, pg in enumerate(pages): if page_no < len(self.parent().structure.sections): - if pages[page_no] != self.parent().structure.sections[page_no]: + if pg != self.parent().structure.sections[page_no]: self.parent().structure.pop(self.parent().structure.sections[page_no]) while (page_no < len(self.parent().structure.sections)) and ( - pages[page_no] != self.parent().structure.sections[page_no]): + pg != self.parent().structure.sections[page_no]): self.parent().structure.pop(self.parent().structure.sections[page_no]) else: break @@ -1656,19 +1623,19 @@ class EditGui(QWidget): else: # it's the question moved here, it's not been processed yet diff = [] - for other_page in range(len(self.parent().structure.sections)): - if len(self.parent().structure[self.parent().structure.sections[other_page]].sections) > len(questions[other_page]): + for other_page, sec in enumerate(self.parent().structure.sections): + if len(self.parent().structure[sec].sections) > len(questions[other_page]): # find the page it's came from - diff = [self.parent().structure.sections[other_page]] + diff = [sec] # print("other page:", diff) # print(self.parent().structure[diff[0]]) # print("sec", self.parent().structure[diff[0]].sections) # print("new quests",questions[other_page]) - for other_sections in self.parent().structure[self.parent().structure.sections[other_page]].sections: + for other_sections in self.parent().structure[sec].sections: # print("e2", other_sections) if other_sections not in questions[other_page]: # find the question removed # print("diff found", other_sections) - diff.append(self.parent().structure[self.parent().structure.sections[other_page]][other_sections]) + diff.append(self.parent().structure[sec][other_sections]) # print("Adding", questions[page][quest_no], diff[1]) self.parent().structure[pages[page]][questions[page][quest_no]] = diff[1] # append here # print("New structure after adding:", self.parent().structure.sections, self.parent().structure[pages[page]].sections) @@ -1680,4 +1647,4 @@ class EditGui(QWidget): if __name__ == '__main__': app = QApplication([]) ex = QEditGuiMain() - app.exec_() + app.exec() diff --git a/src/RadioMatrix.py b/src/RadioMatrix.py index 96626fd048c6a76534f4e0104c0aa6d780bcd5fd..6cb896200a548407f25693b13d8f969582b77cc7 100644 --- a/src/RadioMatrix.py +++ b/src/RadioMatrix.py @@ -1,8 +1,8 @@ """A matrix of questions with radiobuttons as answers using all one set of answer possibilities.""" import random -from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import QWidget, QFormLayout, QLabel, QHBoxLayout +from PySide6.QtCore import Qt +from PySide6.QtWidgets import QWidget, QFormLayout, QLabel, QHBoxLayout from src.AnswerRadioButton import make_answers @@ -37,17 +37,17 @@ class RadioMatrix(QWidget): self.name = None self.id = qid - if type(questions) is str: + if isinstance(questions, str): questions = [questions] - if type(answers) is str: + if isinstance(answers, str): answers = [answers] - if randomize is True: + if randomize: random.seed(self.parent().parent().start.__str__()) # uses starting time - self.id_order = [i+1 for i in range(0, len(questions))] + self.id_order = [i + 1 for i in range(0, len(questions))] random.shuffle(self.id_order) else: - self.id_order = [i+1 for i in range(0, len(questions))] + self.id_order = [i + 1 for i in range(0, len(questions))] layout = QFormLayout() headerlbl = QLabel("") @@ -56,14 +56,14 @@ class RadioMatrix(QWidget): for h in range(0, len(answers) - 1): lbl = QLabel() lbl.setText(answers[h]) - lbl.setAlignment(Qt.AlignHCenter) + lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter) lbl.setObjectName("MatrixHeader") header_layout.addWidget(lbl) header_layout.addStretch() if len(answers) >= 1: lbl = QLabel() lbl.setText(answers[-1]) - lbl.setAlignment(Qt.AlignHCenter) + lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter) lbl.setObjectName("MatrixHeader") header_layout.addWidget(lbl) header_widget = QWidget() @@ -73,10 +73,8 @@ class RadioMatrix(QWidget): self.buttongroups = [] self.questions = [] for quest in self.id_order: - bg_layout, bg = make_answers([""]*len(answers), self, - qid+"_{0:02d}".format(quest) if len(questions) >= 10 else qid+"_{}".format(quest), - self.name, start_answer_id, log=False) - quest_label = QLabel(questions[quest-1]) + bg_layout, bg = make_answers([""] * len(answers), self, f'{qid}_{quest:02d}' if len(questions) >= 10 else f'{qid}_{quest}', self.name, start_answer_id, log=False) + quest_label = QLabel(questions[quest - 1]) layout.addRow(quest_label, bg_layout) self.buttongroups.append(bg) self.questions.append(quest_label) diff --git a/src/Slider.py b/src/Slider.py index d79a0b2269ebda1aef767e8473351c0318c1ca01..a50c3a186352bb6e45dd478551bd82ca296234a1 100644 --- a/src/Slider.py +++ b/src/Slider.py @@ -5,10 +5,9 @@ position - a function that's not possible with QSlider. The functionality is adapted from: https://www.queryxchange.com/q/27_52689047/moving-qslider-to-mouse-click-position/ """ from math import ceil - -from PyQt5.QtCore import Qt, QPoint, pyqtSignal -from PyQt5.QtGui import QPainter, QColor, QPen, QPaintEvent, QMouseEvent -from PyQt5.QtWidgets import QSlider, QStyle, QStyleOptionSlider +from PySide6.QtCore import Qt, Signal +from PySide6.QtGui import QPainter, QColor, QPen +from PySide6.QtWidgets import QSlider, QStyle, QStyleOptionSlider class Slider(QSlider): @@ -38,8 +37,16 @@ class Slider(QSlider): strokewidth_disabled = None strokecolor_disabled = None moving = False - mushra_stopped = pyqtSignal() + mushra_stopped = Signal(str) moved = False + mouse_down = False + prev = None + _min = None + _max = None + start = None + step = None + sid = None + tick_dist = None def paintEvent(self, event): """ @@ -65,36 +72,33 @@ class Slider(QSlider): opt.initFrom(self) opt.orientation = self.orientation() - groove = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self) - handle = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderHandle, self) + groove = self.style().subControlRect(QStyle.ComplexControl.CC_Slider, opt, QStyle.SubControl.SC_SliderGroove, self) + handle = self.style().subControlRect(QStyle.ComplexControl.CC_Slider, opt, QStyle.SubControl.SC_SliderHandle, self) - interval = self.tickInterval() - if self.tickPosition() != QSlider.NoTicks: - min_value = 0 - max_value = int((self._max-self._min)/self.step) if self._max > self._min else - 1 * int((self._max-self._min)/self.step) - for i in range(0, max_value - min_value + 1, interval): + if self.tickPosition() != QSlider.TickPosition.NoTicks: + for i in range(0, self.maximum() - self.minimum() + 1, self.tickInterval()): h = 10 magic_height = 4 - if self.orientation() == Qt.Horizontal: - x = round(i / (max_value - min_value) * self.width()) + if self.orientation() == Qt.Orientation.Horizontal: + x = round(i / (self.maximum() - self.minimum()) * self.width()) if x == 0: x += ceil(0.5 * p.pen().width()) if p.pen().width() % 2 == 0: x += 1 - elif x >= (self.width()): + elif x >= self.width(): x = self.width() - ceil(0.5 * p.pen().width()) - 1 else: x -= ceil(0.5 * p.pen().width()) - if (self.tickPosition() == QSlider.TicksBothSides) or (self.tickPosition() == QSlider.TicksAbove): + if (self.tickPosition() == QSlider.TickPosition.TicksBothSides) or (self.tickPosition() == QSlider.TickPosition.TicksAbove): y = groove.top() - ceil(0.5 * p.pen().width()) p.drawLine(x, y + h, x, y - magic_height) - if (self.tickPosition() == QSlider.TicksBothSides) or (self.tickPosition() == QSlider.TicksBelow): + if (self.tickPosition() == QSlider.TickPosition.TicksBothSides) or (self.tickPosition() == QSlider.TickPosition.TicksBelow): y = groove.bottom() if p.pen().width() > 1: y += ceil(0.5 * p.pen().width()) p.drawLine(x, y + h, x, y - magic_height) - elif self.orientation() == Qt.Vertical: - y = round(i / (max_value - min_value) * groove.height()) + elif self.orientation() == Qt.Orientation.Vertical: + y = round(i / (self.maximum() - self.minimum()) * groove.height()) if y == groove.height(): # lowest mark y -= ceil(0.5 * p.pen().width()) - 1 elif y == 0: @@ -103,12 +107,12 @@ class Slider(QSlider): y += 1 else: y -= ceil(0.5 * p.pen().width()) - if (self.tickPosition() == QSlider.TicksBothSides) or (self.tickPosition() == QSlider.TicksLeft): + if (self.tickPosition() == QSlider.TickPosition.TicksBothSides) or (self.tickPosition() == QSlider.TickPosition.TicksLeft): x = groove.left() + handle.width() if p.pen().width() > 1: x -= ceil(0.5 * p.pen().width()) p.drawLine(x, y, x - magic_height, y) - if (self.tickPosition() == QSlider.TicksBothSides) or (self.tickPosition() == QSlider.TicksRight): + if (self.tickPosition() == QSlider.TickPosition.TicksBothSides) or (self.tickPosition() == QSlider.TickPosition.TicksRight): x = groove.right() - handle.width() if p.pen().width() > 1: x += ceil(0.5 * p.pen().width()) @@ -123,18 +127,16 @@ class Slider(QSlider): event : QMouseEvent event that occurred, only presses of the left mouse button are of relevance here """ - if event.button() == Qt.LeftButton: - if self.orientation() == Qt.Horizontal: + if event.button() == Qt.MouseButton.LeftButton: + if self.orientation() == Qt.Orientation.Horizontal: self.blockSignals(True) - val = self.pixel_pos_to_range_value(event.pos()) + val = self.pixel_pos_to_range_value(event.position()) self.moved = True - if self.value() != val: + self.mouse_down = True + if self.value() != val: # TODO? self.setValue(val) self.blockSignals(False) - # print("New val {} unblocked (press)".format(val)) - self.valueChanged.emit(self.value()) - self.mushra_stopped.emit() - if self.orientation() == Qt.Horizontal: + if self.orientation() == Qt.Orientation.Horizontal: self.blockSignals(True) def mouseMoveEvent(self, event): @@ -145,12 +147,13 @@ class Slider(QSlider): event : QMouseEvent event that occurred, only presses of the left mouse button are of relevance here """ - if self.orientation() == Qt.Horizontal: - self.blockSignals(True) - val = self.pixel_pos_to_range_value(event.pos()) - if self.value() != val: - self.setValue(val) - self.moving = True + if self.mouse_down: + if self.orientation() == Qt.Orientation.Horizontal: + self.blockSignals(True) + val = self.pixel_pos_to_range_value(event.position()) + if self.value() != val: + self.setValue(val) + self.moving = True def mouseReleaseEvent(self, event): """End of move event, populate new value. @@ -160,17 +163,18 @@ class Slider(QSlider): event : QMouseEvent event that occurred, only presses of the left mouse button are of relevance here """ - if self.orientation() == Qt.Horizontal: + if self.orientation() == Qt.Orientation.Horizontal: self.blockSignals(True) + self.mouse_down = False if self.moving: - val = self.pixel_pos_to_range_value(event.pos()) + val = self.pixel_pos_to_range_value(event.position()) self.setValue(val) self.moving = False self.blockSignals(False) - # print("New val {} unblocked (move)".format(val)) - self.valueChanged.emit(self.value()) - self.mushra_stopped.emit() - if self.orientation() == Qt.Horizontal: + # print(f'New val {val} unblocked (move)') + self.valueChanged.emit(val) + self.mushra_stopped.emit(self.sid) + if self.orientation() == Qt.Orientation.Horizontal: self.blockSignals(True) def keyPressEvent(self, event): @@ -181,9 +185,9 @@ class Slider(QSlider): event : QKeyEvent event that occurred, only presses of the arrow keys are relevant """ - if self.orientation() == Qt.Horizontal: + if self.orientation() == Qt.Orientation.Horizontal: self.blockSignals(True) - if event.key() in [Qt.Key_Up, Qt.Key_Down, Qt.Key_Left, Qt.Key_Right]: + if event.key() in [Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Left, Qt.Key.Key_Right]: self.prev = self.value() super(Slider, self).keyPressEvent(event) @@ -195,16 +199,16 @@ class Slider(QSlider): event : QKeyEvent event that occurred, only presses of the arrow keys are relevant """ - if self.orientation() == Qt.Horizontal: + if self.orientation() == Qt.Orientation.Horizontal: self.blockSignals(True) - if event.key() in [Qt.Key_Up, Qt.Key_Down, Qt.Key_Left, Qt.Key_Right]: + if event.key() in [Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Left, Qt.Key.Key_Right]: super(Slider, self).keyReleaseEvent(event) if self.value() != self.prev: self.blockSignals(False) - # print("New val {} unblocked (key)".format(self.value())) + # print(f'New val {self.value()} unblocked (key)') self.valueChanged.emit(self.value()) - self.mushra_stopped.emit() - if self.orientation() == Qt.Horizontal: + self.mushra_stopped.emit(self.sid) + if self.orientation() == Qt.Orientation.Horizontal: self.blockSignals(True) def value(self): @@ -214,8 +218,15 @@ class Slider(QSlider): ------- int or float : current handle position in the range """ - value = round(self._min + super(Slider, self).value() * (self.step if self._min < self._max else -1*self.step), str(self.step)[::-1].find('.')) - return value if int(self.step) != float(self.step) else int(value) + if not self.invertedAppearance(): + value = self.minimum() + self._min + super(Slider, self).value() * self.step + if int(self.step) != float(self.step): # float step size + value = round(value, str(self.step)[::-1].find('.')) + return value if int(self.step) != float(self.step) else int(value) + else: + value = self._min + super(Slider, self).value() * self.step # super(Slider, self).value() #TODO float?TODO TODO TODO FALSCH!!! + # print("new value", value) + return value if int(self.step) != float(self.step) else int(value) def get_moved(self): """ Return whether the slider has been touched by the user. @@ -225,42 +236,7 @@ class Slider(QSlider): boolean - if the slider handle has been moved """ return self.moved - ''' - def setValue(self, value): - index = round((value - self._min) / self.step) - return super(Slider, self).setValue(index) - def value(self): - return self.index * self.step + self._min - - @property - def index(self): - return super(Slider, self).value() - - def setIndex(self, index): - return super(Slider, self).setValue(index) - - def setMinimum(self, value): - self._min = value - self._range_adjusted() - - def setMaximum(self, value): - self._max = value - self._range_adjusted() - - def setInterval(self, value): - # To avoid division by zero - if not value: - raise ValueError('Interval of zero specified') - self.step = value - self._range_adjusted() - - def _range_adjusted(self): - number_of_steps = int((self._max - self._min) / self.step) - print(number_of_steps, self._max, self._min, self.step) - super(Slider, self).setMaximum(max(number_of_steps, self._max)) - print(self.minimum(), self.maximum(), self.value()) - ''' def pixel_pos_to_range_value(self, pos): """ Helper to move the slider to the cursor independently of the OS and stylesheet. @@ -277,10 +253,10 @@ class Slider(QSlider): """ opt = QStyleOptionSlider() self.initStyleOption(opt) - gr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self) - sr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderHandle, self) + gr = self.style().subControlRect(QStyle.ComplexControl.CC_Slider, opt, QStyle.SubControl.SC_SliderGroove, self) + sr = self.style().subControlRect(QStyle.ComplexControl.CC_Slider, opt, QStyle.SubControl.SC_SliderHandle, self) - if self.orientation() == Qt.Horizontal: + if self.orientation() == Qt.Orientation.Horizontal: slider_length = sr.width() slider_min = gr.x() slider_max = gr.right() - slider_length + 1 @@ -289,11 +265,10 @@ class Slider(QSlider): slider_min = gr.y() slider_max = gr.bottom() - slider_length + 1 pr = pos - sr.center() + sr.topLeft() - p = pr.x() if self.orientation() == Qt.Horizontal else pr.y() - return QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), p - slider_min, - slider_max - slider_min, opt.upsideDown) + p = pr.x() if self.orientation() == Qt.Orientation.Horizontal else pr.y() + return QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), p - slider_min, slider_max - slider_min, opt.upsideDown) - def prepare_slider(self, min_val, max_val, start, step=1, tickpos=QSlider.TicksBelow): + def prepare_slider(self, min_val, max_val, start, step=1, tick_interval=1, tickpos=QSlider.TickPosition.TicksBelow, sid=None): """ Set all parameters of the slider at once, to reduce repeating bulky code in the main gui class. @@ -307,23 +282,32 @@ class Slider(QSlider): default starting point of the slider, if outside of min_val and max_val, it will be set to the closest of them step : int, default=1 step size of slider + tick_interval : int, default=1 + distance between visible ticks of slider tickpos : QSlider.TickPosition, default=QSlider.TicksBelow - position of tickmarks (if any), see also PyQt5.QtWidgets.QSlider + position of tickmarks (if any), see also PySide6.QtWidgets.QSlider """ self._min = min_val self._max = max_val self.step = step self.start = start self.prev = None - if self.orientation() == Qt.Horizontal: + if self.orientation() == Qt.Orientation.Horizontal: self.blockSignals(True) # don't spam new values on move, click and release - self.setMinimum(0) - self.setMaximum(int((max_val-min_val)/self.step) if max_val > min_val else -1*int((max_val-min_val)/self.step)) - self.setTickInterval(1) + if self._min > self._max: + self.setInvertedAppearance(True) + self.setMaximum(0) + self.setMinimum(int((max_val - min_val) / self.step)) + else: + self.setMinimum(0) + self.setMaximum(int((max_val - min_val) / self.step)) + self.setValue(round((self.start - self._min) / self.step)) + self.setTickInterval(tick_interval) + # TODO self.tick_dist = int(tick_interval) self.setSingleStep(1) - self.setValue(round(abs((start-self._min)/step))) self.setTickPosition(tickpos) - + self.sid = sid + if hasattr(self.parent(), "page_log"): # awkward workaround to reference "Page" sheet = self.parent().parent().styleSheet() sheet = sheet[sheet.find("Slider::groove"):] @@ -331,20 +315,20 @@ class Slider(QSlider): width = 1 color = QColor("black") if sheet.find("border-width:") > -1: - width = sheet[sheet.find("border-width:")+len("border-width:"):sheet.find("px", sheet.find("border-width:"))].strip(" ") + width = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find("border-width:"))].strip(" ") elif sheet.find("border:") > -1: - border = sheet[sheet.find("border:")+len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ") + border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ") border = border.split(" ") for entry in border: if entry.find("px") > -1: width = entry.strip(" px") if sheet.find("border-color:") > -1: - color = sheet[sheet.find("border-color:")+len("border-color:"):sheet.find(";", sheet.find("border-color:"))].strip(" ") + color = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find("border-color:"))].strip(" ") elif sheet.find("border:") > -1: - border = sheet[sheet.find("border:")+len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ") + border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ") border = border.split(" ") for entry in border: - if QColor.isValidColor(entry): + if QColor.isValidColorName(entry): color = entry self.strokewidth = int(width) self.strokecolor = QColor(color) @@ -370,20 +354,19 @@ class Slider(QSlider): border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ") border = border.split(" ") for entry in border: - if QColor.isValidColor(entry): + if QColor.isValidColorName(entry): color_disabled = entry self.strokewidth_disabled = int(width_disabled) self.strokecolor_disabled = QColor(color_disabled) if self.objectName() != "": sheet = self.parent().parent().styleSheet() - sheet = sheet[sheet.find("Slider#{}::groove".format(self.objectName())):] + sheet = sheet[sheet.find(f'Slider#{self.objectName()}::groove'):] sheet = sheet[:sheet.find("}")] width = 1 color = QColor("black") if sheet.find("border-width:") > -1: - width = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find( - "border-width:"))].strip(" ") + width = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find("border-width:"))].strip(" ") elif sheet.find("border:") > -1: border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ") border = border.split(" ") @@ -391,25 +374,23 @@ class Slider(QSlider): if entry.find("px") > -1: width = entry.strip(" px") if sheet.find("border-color:") > -1: - color = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find( - "border-color:"))].strip(" ") + color = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find("border-color:"))].strip(" ") elif sheet.find("border:") > -1: border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ") border = border.split(" ") for entry in border: - if QColor.isValidColor(entry): + if QColor.isValidColorName(entry): color = entry self.strokewidth = int(width) self.strokecolor = QColor(color) sheet = self.parent().parent().styleSheet() - sheet = sheet[sheet.find("Slider#{}::groove:disabled".format(self.objectName())):] + sheet = sheet[sheet.find(f'Slider#{self.objectName()}::groove:disabled'):] sheet = sheet[:sheet.find("}")] width_disabled = self.strokewidth color_disabled = self.strokecolor if sheet.find("border-width:") > -1: - width_disabled = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find( - "border-width:"))].strip(" ") + width_disabled = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find("border-width:"))].strip(" ") elif sheet.find("border:") > -1: border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ") border = border.split(" ") @@ -417,13 +398,12 @@ class Slider(QSlider): if entry.find("px") > -1: width_disabled = entry.strip(" px") if sheet.find("border-color:") > -1: - color_disabled = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find( - "border-color:"))].strip(" ") + color_disabled = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find("border-color:"))].strip(" ") elif sheet.find("border:") > -1: border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ") border = border.split(" ") for entry in border: - if QColor.isValidColor(entry): + if QColor.isValidColorName(entry): color_disabled = entry self.strokewidth_disabled = int(width_disabled) self.strokecolor_disabled = QColor(color_disabled) diff --git a/src/TextEdit.py b/src/TextEdit.py index 89e5042b33a7bae153cceb2bab4948dfd758c46a..9f4ecd6e61bef57edc615cc1ac58c71058acd72f 100644 --- a/src/TextEdit.py +++ b/src/TextEdit.py @@ -3,9 +3,8 @@ A TextEdit editor that sends editingFinished events when the text was changed an Original version (PyQt4): https://gist.github.com/hahastudio/4345418 """ -from PyQt5.QtCore import pyqtSignal, QObject -from PyQt5.QtGui import QFocusEvent -from PyQt5.QtWidgets import QTextEdit +from PySide6.QtCore import Signal +from PySide6.QtWidgets import QTextEdit # noinspection PyUnresolvedReferences @@ -29,15 +28,15 @@ class TextEdit(QTextEdit): .. [1] https://gist.github.com/hahastudio/4345418 """ - editingFinished = pyqtSignal() - receivedFocus = pyqtSignal() + editingFinished = Signal() + receivedFocus = Signal() - def __init__(self, parent): + def __init__(self, parent=None): """ Parameters ---------- - parent : QObject + parent : QObject, opt widget/layout this widget is embedded in """ super(TextEdit, self).__init__(parent) diff --git a/src/Tree.py b/src/Tree.py index 98354ec9425ae26338b87d9fd5e9b6ae1f68c59a..c5354bb1fa9f502c8a38a9bb0d146ba2ed8114cc 100644 --- a/src/Tree.py +++ b/src/Tree.py @@ -1,7 +1,7 @@ """Customized QTreeWidget with drag&drop functionality according to the questionnaire structure.""" -from PyQt5.QtCore import Qt, pyqtSignal -from PyQt5.QtGui import QDragMoveEvent, QDropEvent -from PyQt5.QtWidgets import QTreeWidget, QAbstractItemView, QInputDialog, QLineEdit, QTreeWidgetItem +from PySide6.QtCore import Qt, Signal +from PySide6.QtGui import QDragMoveEvent +from PySide6.QtWidgets import QTreeWidget, QAbstractItemView, QInputDialog, QLineEdit # noinspection PyUnresolvedReferences @@ -17,8 +17,8 @@ class Tree(QTreeWidget): parent : QObject, optional widget/layout this widget is embedded in """ - tree_changed = pyqtSignal() - error_message = pyqtSignal(str) + tree_changed = Signal() + error_message = Signal(str) def __init__(self, parent=None): """ @@ -35,7 +35,7 @@ class Tree(QTreeWidget): self.setDragEnabled(True) self.setDefaultDropAction(Qt.MoveAction) - def dragMoveEvent(self, event: QDragMoveEvent) -> None: + def dragMoveEvent(self, event): """Changed behaviour on dragging. Don't accept any drops from somewhere else. @@ -45,11 +45,11 @@ class Tree(QTreeWidget): event : QDragMoveEvent """ super().dragMoveEvent(event) - if self.dropIndicatorPosition() == self.OnViewport: + if self.dropIndicatorPosition() == QAbstractItemView.OnViewport: # do not accept drop on the viewport event.ignore() - def dropEvent(self, event) -> None: + def dropEvent(self, event): """Changed behaviour on drop, according to the questionnaire structure. This means: \n @@ -63,13 +63,13 @@ class Tree(QTreeWidget): """ source = self.indexFromItem(self.selectedItems()[0]) if event.source() == self: - if self.dropIndicatorPosition() == self.OnViewport: + if self.dropIndicatorPosition() == QAbstractItemView.OnViewport: event.ignore() - if self.dropIndicatorPosition() == self.OnItem: - tree_target_item = self.itemAt(event.pos()) + if self.dropIndicatorPosition() == QAbstractItemView.OnItem: + tree_target_item = self.itemAt(event.position().toPoint()) target_children = [] - for ch in range(self.itemAt(event.pos()).childCount()): - target_children.append(self.itemAt(event.pos()).child(ch)) + for ch in range(self.itemAt(event.position().toPoint()).childCount()): + target_children.append(self.itemAt(event.position().toPoint()).child(ch)) if tree_target_item.parent() is None: # something was dropped on root if source.parent().data() == tree_target_item.text(0): # root item only accepts pages @@ -115,7 +115,7 @@ class Tree(QTreeWidget): else: event.ignore() else: # move above/below item - tree_target_item = self.itemAt(event.pos()) + tree_target_item = self.itemAt(event.position().toPoint()) if tree_target_item.parent() is None: event.ignore() # don't move anything above/below root elif (tree_target_item.parent().parent() is None and source.parent().parent().data() is not None) or \ @@ -187,8 +187,7 @@ class Tree(QTreeWidget): ok : bool True if renaming was executed successfully """ - text, ok = QInputDialog.getText(self, "Rename question", - "Rename the moved question (the name already existed):", QLineEdit.Normal) + text, ok = QInputDialog.getText(self, "Rename question", "Rename the moved question (the name already existed):", QLineEdit.Normal) if not ok: return None, ok else: diff --git a/src/Validator.py b/src/Validator.py index e0cc6ed7a91e041a81654f944ebd722afcfa206b..0862b771700295e5fbb9bb33344b5ede2814698f 100644 --- a/src/Validator.py +++ b/src/Validator.py @@ -4,10 +4,9 @@ import ast import re from os import path -from configobj import ConfigObj -from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator -from PyQt5.QtWidgets import QSizePolicy, QMessageBox -from PyQt5.QtCore import QRegExp +from PySide6.QtGui import QIntValidator, QDoubleValidator, QRegularExpressionValidator, QValidator +from PySide6.QtWidgets import QSizePolicy, QMessageBox +from PySide6.QtCore import QRegularExpression from src.MessageBox import ResizeMessageBox from src.tools import fields_per_type, player_buttons, policy_possibilities, randomize_options, image_positions, video_player @@ -33,7 +32,7 @@ def validate_passwords(file, policy): elif policy[0] == "double": validator = QDoubleValidator(int(policy[1]), int(policy[2]), int(policy[3])) elif policy[0] == "regex": - validator = QRegExpValidator(QRegExp(policy[1])) + validator = QRegularExpressionValidator(QRegularExpression(policy[1])) else: # policy[0] == "None": return True @@ -41,7 +40,7 @@ def validate_passwords(file, policy): passwords = f.read().splitlines() for password in passwords: res = validator.validate(password, 0) - if res[0] != 2: + if res[0] != QValidator.State.Acceptable: return False return True @@ -126,130 +125,126 @@ def listify(structure, status=None, status_duration=None): if "label" in structure[page][quest].keys() and ("," in structure[page][quest]["label"] or "[" in structure[page][quest]["label"] or "]" in structure[page][quest]["label"] or - type(structure[page][quest]["label"]) == list): + isinstance(structure[page][quest]["label"], list)): sublist = False lblcpy = structure[page][quest]["label"] labels = [] try: - if type(lblcpy) == str: + if isinstance(lblcpy, str): if lblcpy[0] == "[" and lblcpy[1] == "[" and lblcpy[-1] == "]" and lblcpy[-2] == "]": lblcpy = lblcpy.strip(' "')[1:-1] elif lblcpy.count("[") == 1 and lblcpy.count("]") == 1 and lblcpy.count(",") == 0: lblcpy = lblcpy.strip(' []"') lblcpy = lblcpy.split(",") - for t in range(0, len(lblcpy)): - if type(lblcpy[t]) == str: - if '[' in lblcpy[t]: # t is list: - if ('[' in lblcpy[t]) and (']' not in lblcpy[t]): + for _, lblc in enumerate(lblcpy): + if isinstance(lblc, str): + if '[' in lblc: # t is list: + if ('[' in lblc) and (']' not in lblc): sublist = True - if ',' not in lblcpy[t]: - labels.append([float(lblcpy[t].strip(" '][").strip('"'))]) + if ',' not in lblc: + labels.append([float(lblc.strip(" '][").strip('"'))]) else: - if len(lblcpy[t].split(",")) == 2: - entry = lblcpy[t].split(",") + if len(lblc.split(",")) == 2: + entry = lblc.split(",") labels.append([float(entry[0].strip(" '[]").strip('"')), entry[1].strip(" '[]").strip('"')]) else: labels[-1].append(float(entry.strip(" '[]").strip('"'))) elif sublist: - if ']' in lblcpy[t]: + if ']' in lblc: sublist = False - labels[-1].append(lblcpy[t].strip(" ]['").strip('"')) + labels[-1].append(lblc.strip(" ]['").strip('"')) else: - labels[-1].append(float(lblcpy[t])) + labels[-1].append(float(lblc)) elif not sublist: - labels.append(lblcpy[t].strip(" '[]").strip('"')) + labels.append(lblc.strip(" '[]").strip('"')) else: - if type(lblcpy[t]) == list or type(lblcpy[t]) == tuple: - if len(lblcpy[t]) == 2: - labels.append([float(lblcpy[t][0]), lblcpy[t][1]]) + if isinstance(lblc, list) or isinstance(lblc, tuple): + if len(lblc) == 2: + labels.append([float(lblc[0]), lblc[1]]) else: - labels[-1].append(lblcpy[t]) + labels[-1].append(lblc) structure[page][quest]["label"] = labels except (ValueError, SyntaxError) as e: if status is not None: - status.showMessage("Invalid value found in a 'label' field: {}".format(e), status_duration) + status.showMessage(f'Invalid value found in a "label" field: {e}', status_duration) if "track" in structure[page][quest].keys() and ("," in structure[page][quest]["track"] or "[" in structure[page][quest]["track"] or "]" in structure[page][quest]["track"] or - type(structure[page][quest]["track"]) == list): + isinstance(structure[page][quest]["track"], list)): sublist = False trackscpy = structure[page][quest]["track"] tracks = [] try: - if type(trackscpy) == str: + if isinstance(trackscpy, str): if trackscpy[0] == "[" and trackscpy[-1] == "]": trackscpy = trackscpy.strip(" []") trackscpy = trackscpy.split(",") - for t in range(0, len(trackscpy)): - if type(trackscpy[t]) == str: - if '[' in trackscpy[t]: # t is list: - if ('[' in trackscpy[t]) and (']' not in trackscpy[t]): + for _, tcpy in enumerate(trackscpy): + if isinstance(tcpy, str): + if '[' in tcpy: # t is list: + if ('[' in tcpy) and (']' not in tcpy): sublist = True - if ',' not in trackscpy[t]: - tracks.append([int(trackscpy[t].strip(" ']["))]) + if ',' not in tcpy: + tracks.append([int(tcpy.strip(" ']["))]) else: tracks.append([]) - for entry in trackscpy[t].split(","): + for entry in tcpy.split(","): tracks[-1].append(int(entry.strip(" '[]"))) elif sublist: - if ']' in trackscpy[t]: + if ']' in tcpy: sublist = False - tracks[-1].append(int(trackscpy[t].strip(" ]['"))) + tracks[-1].append(int(tcpy.strip(" ]['"))) else: - tracks[-1].append(int(trackscpy[t])) + tracks[-1].append(int(tcpy)) elif not sublist: - tracks.append(int(trackscpy[t].strip(" '"))) + tracks.append(int(tcpy.strip(" '"))) else: - if type(trackscpy[t]) == list: + if isinstance(tcpy, list): tracks.append([]) - for s in range(len(trackscpy[t])): - tracks[-1].append(int(trackscpy[t][s])) + for _, tcpys in enumerate(tcpy): + tracks[-1].append(int(tcpys)) else: - tracks.append(trackscpy[t]) + tracks.append(tcpy) structure[page][quest]["track"] = tracks except (ValueError, SyntaxError) as e: if status is not None: - status.showMessage("Invalid value found in a 'track' field: {}".format(e), status_duration) + status.showMessage(f'Invalid value found in a "track" field: {e}', status_duration) try: if "answers" in structure[page][quest].keys(): if "," in structure[page][quest]["answers"]: structure[page][quest]["answers"] = ast.literal_eval(structure[page][quest]["answers"]) - elif type(structure[page][quest]["answers"]) == str: + elif isinstance(structure[page][quest]["answers"], str): structure[page][quest]["answers"] = structure[page][quest]["answers"].strip("[] ") else: # list-like for entry in range(len(structure[page][quest]["answers"])): - if type(entry) == str: - structure[page][quest]["answers"][entry] = structure[page][quest]["answers"][ - entry].strip("[] ") + if isinstance(entry, str): + structure[page][quest]["answers"][entry] = structure[page][quest]["answers"][entry].strip("[] ") if "button_texts" in structure[page][quest].keys(): if "," in structure[page][quest]["button_texts"]: structure[page][quest]["button_texts"] = ast.literal_eval( structure[page][quest]["button_texts"]) - elif type(structure[page][quest]["button_texts"]) == str: + elif isinstance(structure[page][quest]["button_texts"], str): structure[page][quest]["button_texts"] = structure[page][quest]["button_texts"].strip("[] ") else: # list-like for entry in range(len(structure[page][quest]["button_texts"])): - structure[page][quest]["button_texts"][entry] = structure[page][quest]["button_texts"][ - entry].strip("[] ") + structure[page][quest]["button_texts"][entry] = structure[page][quest]["button_texts"][entry].strip("[] ") if "header" in structure[page][quest].keys(): if "," in structure[page][quest]["header"]: structure[page][quest]["header"] = ast.literal_eval(structure[page][quest]["header"]) - elif type(structure[page][quest]["header"]) == str: + elif isinstance(structure[page][quest]["header"], str): structure[page][quest]["header"] = structure[page][quest]["header"].strip("[] ") else: # list-like for entry in range(len(structure[page][quest]["header"])): - structure[page][quest]["header"][entry] = structure[page][quest]["header"][entry].strip( - "[] ") + structure[page][quest]["header"][entry] = structure[page][quest]["header"][entry].strip("[] ") if "questions" in structure[page][quest].keys(): if "," in structure[page][quest]["questions"]: structure[page][quest]["questions"] = ast.literal_eval(structure[page][quest]["questions"]) - elif type(structure[page][quest]["questions"]) == str: + elif isinstance(structure[page][quest]["questions"], str): structure[page][quest]["questions"] = structure[page][quest]["questions"].strip("[] ") else: # list-like for entry in range(len(structure[page][quest]["questions"])): - structure[page][quest]["questions"][entry] = structure[page][quest]["questions"][ - entry].strip("[] ") + structure[page][quest]["questions"][entry] = structure[page][quest]["questions"][entry].strip("[] ") except (ValueError, SyntaxError): if "answers" in structure[page][quest].keys() and "," in structure[page][quest]["answers"]: structure[page][quest]["answers"] = string_to_list(structure[page][quest]["answers"]) @@ -316,7 +311,7 @@ def string_to_list(string): return result -def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): +def validate_questionnaire(structure, suppress=False): """Check the questionnaire structure for duplicates in answer IDs. Parameters @@ -369,7 +364,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): raise ValueError except ValueError: error_found = True - error_details.append("Invalid audio port, couldn't be converted to a number 0-65535.\n") + error_details.append("Invalid audio port, could not be converted to a number 0-65535.\n") elif "audio_ip" in structure.keys(): warning_found = True warning_details.append("No audio_port found, but IP. Audio will be disabled.\n") @@ -385,7 +380,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): raise ValueError except ValueError: error_found = True - error_details.append("Invalid audio receive port, couldn't be converted to a number 0-65535.\n") + error_details.append("Invalid audio receive port, could not be converted to a number 0-65535.\n") if "video_ip" in structure.keys(): if structure["video_ip"] != "": @@ -408,7 +403,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): raise ValueError except ValueError: error_found = True - error_details.append("Invalid video port, couldn't be converted to a number 0-65535.\n") + error_details.append("Invalid video port, could not be converted to a number 0-65535.\n") elif "video_ip" in structure.keys(): warning_found = True warning_details.append("No video_port found, but IP. Video will be disabled.\n") @@ -448,7 +443,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): raise ValueError except ValueError: error_found = True - error_details.append("Invalid pupil port, couldn't be converted to a number 0-65535.\n") + error_details.append("Invalid pupil port, could not be converted to a number 0-65535.\n") elif "pupil_ip" in structure.keys(): warning_found = True warning_details.append("No pupil_port found, but IP. The connection to pupil will be disabled.\n") @@ -477,7 +472,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): raise ValueError except ValueError: error_found = True - error_details.append("Invalid help port, couldn't be converted to a number 0-65535.\n") + error_details.append("Invalid help port, could not be converted to a number 0-65535.\n") elif "help_ip" in structure.keys(): warning_found = True warning_details.append("No help_port found, but IP. Calling help will be disabled.\n") @@ -519,7 +514,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): raise ValueError except ValueError: error_found = True - error_details.append("Invalid global_osc_send_port, couldn't be converted to a number 0-65535.\n") + error_details.append("Invalid global_osc_send_port, could not be converted to a number 0-65535.\n") elif "global_osc_ip" in structure.keys(): warning_found = True warning_details.append("No global_osc_send_port found, but IP. Sending over global will be disabled.\n") @@ -535,7 +530,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): raise ValueError except ValueError: error_found = True - error_details.append("Invalid global_osc_recv_port, couldn't be converted to a number 0-65535.\n") + error_details.append("Invalid global_osc_recv_port, could not be converted to a number 0-65535.\n") elif "global_osc_ip" in structure.keys(): warning_found = True warning_details.append("No global_osc_recv_port found, but IP. Receiving over global will be disabled.\n") @@ -564,13 +559,11 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): warning_found = True warning_details.append("Text for forward and backward button are the same.\n") - if "send_text" in structure.keys() and "forward_text" in structure.keys() and structure["send_text"] == structure[ - "forward_text"]: + if "send_text" in structure.keys() and "forward_text" in structure.keys() and structure["send_text"] == structure["forward_text"]: warning_found = True warning_details.append("Text for forward and send button are the same.\n") - if "answer_pos" in structure.keys() and "answer_neg" in structure.keys() and structure["answer_pos"] == structure[ - "answer_neg"]: + if "answer_pos" in structure.keys() and "answer_neg" in structure.keys() and structure["answer_pos"] == structure["answer_neg"]: warning_found = True warning_details.append("Text for positive and negative answer are the same.\n") @@ -641,7 +634,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): for page in structure.sections: if not structure[page].sections: warning_found = True - warning_details.append("There are no questions on page {}.\n".format(page)) + warning_details.append(f'There are no questions on page {page}.\n') if "pupil_on_next" in structure[page].keys(): if structure[page]["pupil_on_next"] == '' or structure[page]["pupil_on_next"] == 'None': @@ -651,72 +644,59 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): warning_found = True warning_details.append("Incomplete connection to pupil given. The connection to pupil will be disabled.\n") - if "randomgroup" in structure[page].keys() and ("randomization" not in structure.keys() or \ - ("randomization" in structure.keys() and structure["randomization"] == "None")): + if "randomgroup" in structure[page].keys() and ("randomization" not in structure.keys() or ("randomization" in structure.keys() and structure["randomization"] == "None")): error_found = True error_details.append("Using randomgroup, but no randomization option was chosen.\n") for quest in structure[page].sections: if structure[page][quest] == {}: warning_found = True - warning_details.append("There are no attributes for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'There are no attributes for question "{quest}" on page "{page}".\n') if "id" in structure[page][quest].keys(): if structure[page][quest]["id"] == "": error_found = True - error_details.append("No ID was given for question '{}' on page '{}'.\n".format(quest, page)) - elif structure[page][quest]["id"] not in ids.keys(): + error_details.append(f'No ID was given for question "{quest}" on page "{page}".\n') + elif structure[page][quest]["id"] not in ids: ids[structure[page][quest]["id"]] = (page, quest) else: error_found = True error_details.append( - "ID '{}' already used in question '{}' on page '{}'. Found again in question '{}' on page '{}'.\n".format( - structure[page][quest]["id"], ids[structure[page][quest]["id"]][1], - ids[structure[page][quest]["id"]][0], quest, page)) - elif "id" not in structure[page][quest].keys() and "type" in structure[page][quest].keys() and \ - "id" in fields_per_type[structure[page][quest]["type"]][0].keys(): + f'ID "{structure[page][quest]["id"]}" already used in question "{ids[structure[page][quest]["id"]][1]}" on page "{ids[structure[page][quest]["id"]][0]}". Found again in question "{quest}" on page "{page}".\n') + elif "id" not in structure[page][quest].keys() and "type" in structure[page][quest].keys() and "id" in fields_per_type[structure[page][quest]["type"]][0].keys(): error_found = True - error_details.append("No ID was given for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No ID was given for question "{quest}" on page "{page}".\n') if "x" in structure[page][quest].keys(): try: _ = structure[page][quest].as_bool("x") except ValueError: error_found = True - error_details.append( - "No valid value found for 'x' for question '{}' on page '{}'.\n".format(quest, page)) - structure[page][quest][ - "x"] = False # This happens so the rest of the routine where x is referenced doesn't have to catch errors - elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and \ - "x" not in structure[page][quest].keys(): + error_details.append(f'No valid value found for "x" for question "{quest}" on page "{page}".\n') + structure[page][quest]["x"] = False # This happens so the rest of the routine where x is referenced does not have to catch errors + elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and "x" not in structure[page][quest].keys(): structure[page][quest]["x"] = False warning_found = True - warning_details.append( - "No option for 'x' found for question '{}' on page '{}', using False as default value.\n".format(quest, page)) + warning_details.append(f'No option for "x" found for question "{quest}" on page "{page}", using False as default value.\n') if "play_once" in structure[page][quest].keys(): try: _ = structure[page][quest].as_bool("play_once") except ValueError: error_found = True - error_details.append( - "No valid value found for 'play_once' for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No valid value found for "play_once" for question "{quest}" on page "{page}".\n') structure[page][quest]["play_once"] = False - elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Player" and \ - "play_once" not in structure[page][quest].keys(): + elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Player" and "play_once" not in structure[page][quest].keys(): structure[page][quest]["play_once"] = False warning_found = True - warning_details.append( - "No option for 'play_once' found for question '{}' on page '{}', using False by default.\n".format( - quest, page)) + warning_details.append(f'No option for "play_once" found for question "{quest}" on page "{page}", using False by default.\n') if "required" in structure[page][quest].keys(): try: _ = structure[page][quest].as_bool("required") except ValueError: error_found = True - error_details.append( - "No valid value found for 'required' for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No valid value found for "required" for question "{quest}" on page "{page}".\n') structure[page][quest]["required"] = False # default value if "labelled" in structure[page][quest].keys(): @@ -724,205 +704,154 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): _ = structure[page][quest].as_bool("labelled") except ValueError: error_found = True - error_details.append( - "No valid value found for 'labelled' for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No valid value found for "labelled" for question "{quest}" on page "{page}".\n') structure[page][quest]["labelled"] = False # default value - elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \ - "labelled" not in structure[page][quest].keys(): + elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and "labelled" not in structure[page][quest].keys(): structure[page][quest]["labelled"] = False warning_found = True - warning_details.append( - "No option for 'labelled' found for question '{}' on page '{}', setting it to False.\n".format( - quest, page)) + warning_details.append(f'No option for "labelled" found for question "{quest}" on page "{page}", setting it to False.\n') if "question_above" in structure[page][quest].keys(): try: _ = structure[page][quest].as_bool("question_above") except ValueError: error_found = True - error_details.append( - "No valid value found for 'question_above' for question '{}' on page '{}'.\n".format(quest, - page)) + error_details.append(f'No valid value found for "question_above" for question "{quest}" on page "{page}".\n') structure[page][quest]["question_above"] = False # default value if "text" in structure[page][quest].keys() and structure[page][quest]["text"] == "": warning_found = True - warning_details.append("No text was given for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No text was given for question "{quest}" on page "{page}".\n') elif "text" not in structure[page][quest].keys() and "type" in structure[page][quest].keys() and \ "text" in fields_per_type[structure[page][quest]["type"]][0].keys(): structure[page][quest]["text"] = "" warning_found = True - warning_details.append("No text was given for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No text was given for question "{quest}" on page "{page}".\n') if "answers" in structure[page][quest].keys(): - if structure[page][quest]["answers"] == "" and ("type" not in structure[page][quest].keys() or - ("type" in structure[page][quest].keys() and not structure[page][quest]["type"] == "ABX")): + if structure[page][quest]["answers"] == "" and ("type" not in structure[page][quest].keys() or ("type" in structure[page][quest].keys() and not structure[page][quest]["type"] == "ABX")): warning_found = True - warning_details.append( - "No answer possibilities were given for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No answer possibilities were given for question "{quest}" on page "{page}".\n') if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX": - if ((type(structure[page][quest]["answers"]) != list and type( - structure[page][quest]["answers"]) != tuple) and structure[page][quest]["answers"] != "") or \ - ((type(structure[page][quest]["answers"]) == list or type( - structure[page][quest]["answers"]) == tuple) and len( - structure[page][quest]["answers"]) != 2): + if ((not isinstance(structure[page][quest]["answers"], list) and not isinstance(structure[page][quest]["answers"], tuple)) and + structure[page][quest]["answers"] != "") or \ + (isinstance(structure[page][quest]["answers"], (list, tuple)) and len(structure[page][quest]["answers"]) != 2): error_found = True - error_details.append( - "Please give two answer options for the ABX type question '{}' on page '{}' or leave this field empty.\n".format( - quest, page)) + error_details.append(f'Please give two answer options for the ABX type question "{quest}" on page "{page}" or leave this field empty.\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "AFC": - if ((type(structure[page][quest]["answers"]) != list and type( - structure[page][quest]["answers"]) != tuple) and structure[page][quest]["answers"] != "") or \ - ((type(structure[page][quest]["answers"]) == list or type( - structure[page][quest]["answers"]) == tuple) and len( - structure[page][quest]["answers"]) != structure[page][quest].as_int( - "number_of_choices")): + if ((not isinstance(structure[page][quest]["answers"], list) and not isinstance(structure[page][quest]["answers"], tuple)) and structure[page][quest]["answers"] != "") or (isinstance(structure[page][quest]["answers"], (list, tuple)) and len(structure[page][quest]["answers"]) != structure[page][quest].as_int("number_of_choices")): error_found = True - error_details.append( - "Please give as many answer options for the AFC type question '{}' as number_of_choices on page '{}' or leave this field empty.\n".format( - quest, page)) + error_details.append(f'Please give as many answer options for the AFC type question "{quest}" as number_of_choices on page "{page}" or leave this field empty.\n') elif "type" in structure[page][quest].keys() and \ (structure[page][quest]["type"] == "Radio" or structure[page][quest]["type"] == "Check" or structure[page][quest]["type"] == "Matrix") and "answers" not in structure[page][quest].keys(): structure[page][quest]["answers"] = "" warning_found = True - warning_details.append( - "No answer possibilities were given for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No answer possibilities were given for question "{quest}" on page "{page}".\n') if "start_answer_id" in structure[page][quest].keys(): try: int(structure[page][quest]["start_answer_id"]) if int(structure[page][quest]["start_answer_id"]) < 0: error_found = True - error_details.append( - "The start answer ID in question '{}' on page '{}' can't have a negative value.\n".format( - quest, page)) + error_details.append(f'The start answer ID in question "{quest}" on page "{page}" can not have a negative value.\n') except ValueError: error_found = True - error_details.append( - "The start answer ID in question '{}' on page '{}' couldn't be interpreted as an integer.\n".format( - quest, page)) + error_details.append(f'The start answer ID in question "{quest}" on page "{page}" could not be interpreted as an integer.\n') if "min" in structure[page][quest].keys(): if structure[page][quest]["min"] == "": error_found = True - error_details.append( - "No minimum value was given for the slider in question '{}' on page '{}'.\n".format(quest, - page)) + error_details.append(f'No minimum value was given for the slider in question "{quest}" on page "{page}".\n') else: try: float(structure[page][quest]["min"]) except ValueError: error_found = True - error_details.append( - "The minimum value found for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format( - quest, page)) - elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \ - "min" not in structure[page][quest].keys(): + error_details.append(f'The minimum value found for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n') + elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and "min" not in structure[page][quest].keys(): error_found = True - error_details.append( - "No minimum value was given for the slider in question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No minimum value was given for the slider in question "{quest}" on page "{page}".\n') if "max" in structure[page][quest].keys(): if structure[page][quest]["max"] == "": error_found = True - error_details.append( - "No maximum value was given for the slider in question '{}' on page '{}'.\n".format(quest, - page)) + error_details.append(f'No maximum value was given for the slider in question "{quest}" on page "{page}".\n') else: try: float(structure[page][quest]["max"]) except ValueError: error_found = True - error_details.append( - "The maximum value found for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format( - quest, page)) + error_details.append(f'The maximum value found for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n') try: if "min" in structure[page][quest].keys() and round(float(structure[page][quest]["max"]) - float(structure[page][quest]["min"]), 3) == 0.0: error_found = True - error_details.append( - "Maximum and Minimum value for the slider in question '{}' on page '{}' are the same.\n".format( - quest, page)) + error_details.append(f'Maximum and Minimum value for the slider in question "{quest}" on page "{page}" are the same.\n') except ValueError: pass elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \ "max" not in structure[page][quest].keys(): error_found = True - error_details.append( - "No maximum value was given for the slider in question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'"No maximum value was given for the slider in question "{quest}" on page "{page}".\n') if "start" in structure[page][quest].keys(): if structure[page][quest]["start"] == "": error_found = True - error_details.append( - "No starting value was given for the slider in question '{}' on page '{}'.\n".format(quest, - page)) + error_details.append(f'No starting value was given for the slider in question "{quest}" on page "{page}".\n') else: try: float(structure[page][quest]["start"]) if "min" in structure[page][quest].keys() and "max" in structure[page][quest].keys(): - if float(structure[page][quest]["start"]) < float(structure[page][quest]["min"]) < float(structure[page][quest]["max"]) or \ - float(structure[page][quest]["start"]) > float(structure[page][quest]["min"]) > float(structure[page][quest]["max"]): - structure[page][quest]["start"] = float(structure[page][quest]["min"]) - elif float(structure[page][quest]["start"]) > float(structure[page][quest]["max"]) < float(structure[page][quest]["min"]) or \ - float(structure[page][quest]["start"]) < float(structure[page][quest]["max"]) < float(structure[page][quest]["min"]): - structure[page][quest]["start"] = float(structure[page][quest]["max"]) + if float(structure[page][quest]["min"]) < float(structure[page][quest]["max"]): + if float(structure[page][quest]["start"]) < float(structure[page][quest]["min"]): + structure[page][quest]["start"] = float(structure[page][quest]["min"]) if float(structure[page][quest]["min"]) != int(structure[page][quest]["min"]) or float(structure[page][quest]["step"]) != int(structure[page][quest]["step"]) else int(structure[page][quest]["min"]) + elif float(structure[page][quest]["start"]) > float(structure[page][quest]["max"]): + structure[page][quest]["start"] = float(structure[page][quest]["max"]) if float(structure[page][quest]["max"]) != int(structure[page][quest]["max"]) or float(structure[page][quest]["step"]) != int(structure[page][quest]["step"]) else int(structure[page][quest]["max"]) + else: # decreasing numbers + if float(structure[page][quest]["start"]) > float(structure[page][quest]["min"]): + structure[page][quest]["start"] = float(structure[page][quest]["min"]) if float(structure[page][quest]["min"]) != int(structure[page][quest]["min"]) or float(structure[page][quest]["step"]) != int(structure[page][quest]["step"]) else int(structure[page][quest]["min"]) + elif float(structure[page][quest]["start"]) < float(structure[page][quest]["max"]): + structure[page][quest]["start"] = float(structure[page][quest]["max"]) if float(structure[page][quest]["max"]) != int(structure[page][quest]["max"]) or float(structure[page][quest]["step"]) != int(structure[page][quest]["step"]) else int(structure[page][quest]["max"]) except ValueError: error_found = True - error_details.append( - "The starting value found for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format( - quest, page)) + error_details.append(f'The starting value found for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \ "start" not in structure[page][quest].keys(): error_found = True - error_details.append( - "No starting value was given for the slider in question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No starting value was given for the slider in question "{quest}" on page "{page}".\n') if "step" in structure[page][quest].keys(): if structure[page][quest]["step"] == "": error_found = True - error_details.append( - "No step value was given for the slider in question '{}' on page '{}'.\n".format(quest, - page)) + error_details.append(f'No step value was given for the slider in question "{quest}" on page "{page}".\n') else: try: if float(structure[page][quest]["step"]) <= 0: error_found = True - error_details.append( - "The step value found for the slider in question '{}' on page '{}' needs to be bigger than 0.\n".format( - quest, page)) + error_details.append(f'The step value found for the slider in question "{quest}" on page "{page}" needs to be bigger than 0.\n') except ValueError: error_found = True - error_details.append( - "The step value found for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format( - quest, page)) + error_details.append(f'The step value found for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n') try: if "min" in structure[page][quest].keys() and "max" in structure[page][quest].keys() \ and abs(float(structure[page][quest]["max"]) - float(structure[page][quest]["min"])) < float(structure[page][quest]["step"]): error_found = True - error_details.append( - "The step value for the slider in question '{}' on page '{}' is bigger than the range.\n".format( - quest, page)) + error_details.append(f'The step value for the slider in question "{quest}" on page "{page}" is bigger than the range.\n') except ValueError: pass - elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \ - "step" not in structure[page][quest].keys(): + elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and "step" not in structure[page][quest].keys(): error_found = True - error_details.append( - "No step value was given for the slider in question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No step value was given for the slider in question "{quest}" on page "{page}".\n') if "label" in structure[page][quest].keys() and "labelled" in structure[page][quest].keys() and \ structure[page][quest].as_bool("labelled"): - if type(structure[page][quest]["label"][0]) != list and type(structure[page][quest]["label"][0]) != tuple: - if len(structure[page][quest]["label"]) != (float(structure[page][quest]["max"]) - float( - structure[page][quest]["min"])) / float(structure[page][quest]["step"]) + 1: + if not isinstance(structure[page][quest]["label"][0], list) and not isinstance(structure[page][quest]["label"][0], tuple): + if len(structure[page][quest]["label"]) != (float(structure[page][quest]["max"]) - float(structure[page][quest]["min"])) / float(structure[page][quest]["step"]) + 1: error_found = True - error_details.append( - "The number of given labels doesn't match the number of ticks for question '{}' on page '{}'.\n".format( - quest, page)) + error_details.append(f'The number of given labels does not match the number of ticks for question "{quest}" on page "{page}".\n') elif len(structure[page][quest]["label"][0]) != 2: error_found = True - error_details.append("No valid format for labels for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No valid format for labels for question "{quest}" on page "{page}".\n') else: # list / tuple of single pairs tick = [] try: @@ -931,42 +860,38 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): if not (float(structure[page][quest]["max"]) <= float(pair[0]) <= float(structure[page][quest]["min"]) or float(structure[page][quest]["max"]) >= float(pair[0]) >= float(structure[page][quest]["min"])): error_found = True - error_details.append("Tick value outside of slider range found for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Tick value outside of slider range found for question "{quest}" on page "{page}".\n') if len(tick) != len(set(tick)): error_found = True - error_details.append("Double definition of tick labels found for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Double definition of tick labels found for question "{quest}" on page "{page}".\n') except ValueError: error_found = True - error_details.append( - "A label tick for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format( - quest, page)) + error_details.append(f'A label tick for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n') if "policy" in structure[page][quest].keys(): if structure[page][quest]["policy"] == "None" or structure[page][quest]["policy"] == "[None]": structure[page][quest]["policy"] = ["None"] - if (type(structure[page][quest]["policy"]) == str and structure[page][quest]["policy"] not in policy_possibilities) or \ - (type(structure[page][quest]["policy"]) == list and structure[page][quest]["policy"][0] not in policy_possibilities): + if (isinstance(structure[page][quest]["policy"], str) and structure[page][quest]["policy"] not in policy_possibilities) or \ + (isinstance(structure[page][quest]["policy"], list) and structure[page][quest]["policy"][0] not in policy_possibilities): error_found = True - error_details.append("Invalid policy type in question '{}' on page '{}'.\n".format(quest, page)) - if (type(structure[page][quest]["policy"]) == str and structure[page][quest]["policy"] == "int") or \ - (type(structure[page][quest]["policy"]) == list and structure[page][quest]["policy"][0] == 'int' and len(structure[page][quest]["policy"]) != 3): + error_details.append(f'Invalid policy type in question "{quest}" on page "{page}".\n') + if (isinstance(structure[page][quest]["policy"], str) and structure[page][quest]["policy"] == "int") or \ + (isinstance(structure[page][quest]["policy"], list) and structure[page][quest]["policy"][0] == 'int' and len(structure[page][quest]["policy"]) != 3): error_found = True - error_details.append("Policy type 'int' takes two arguments, a different amount was given in question '{}' on page '{}'.\n".format(quest, page)) - elif (type(structure[page][quest]["policy"]) == str and structure[page][quest]["policy"] == "double") or \ - (type(structure[page][quest]["policy"]) == list and structure[page][quest]["policy"][0] == 'double' and len(structure[page][quest]["policy"]) != 4): + error_details.append(f'Policy type "int" takes two arguments, a different amount was given in question "{quest}" on page "{page}".\n') + elif (isinstance(structure[page][quest]["policy"], str) and structure[page][quest]["policy"] == "double") or \ + (isinstance(structure[page][quest]["policy"], list) and structure[page][quest]["policy"][0] == 'double' and len(structure[page][quest]["policy"]) != 4): error_found = True - error_details.append("Policy type 'double' takes three arguments, a different amount was given in question '{}' on page '{}'.\n".format(quest, page)) - elif (type(structure[page][quest]["policy"]) == str and structure[page][quest]["policy"] == "regex") or \ - (type(structure[page][quest]["policy"]) == list and structure[page][quest]["policy"][0] == 'regex' and len(structure[page][quest]["policy"]) != 2): + error_details.append(f'Policy type "double" takes three arguments, a different amount was given in question "{quest}" on page "{page}".\n') + elif (isinstance(structure[page][quest]["policy"], str) and structure[page][quest]["policy"] == "regex") or \ + (isinstance(structure[page][quest]["policy"], list) and structure[page][quest]["policy"][0] == 'regex' and len(structure[page][quest]["policy"]) != 2): error_found = True - error_details.append("Policy type 'regex' takes one argument, a different amount was given in question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Policy type "regex" takes one argument, a different amount was given in question "{quest}" on page "{page}".\n') if (structure[page][quest]["policy"][0] == "int") or (structure[page][quest]["policy"][0] == "double"): if structure[page][quest]["policy"][1] == "": error_found = True - error_details.append( - "No minimum value was given for the policy in question '{}' on page '{}'.\n".format(quest, - page)) + error_details.append(f'No minimum value was given for the policy in question "{quest}" on page "{page}".\n"') else: try: if structure[page][quest]["policy"][0] == "int": @@ -975,14 +900,10 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): float(structure[page][quest]["policy"][1]) except ValueError: error_found = True - error_details.append( - "Minimum value given for the policy in question '{}' on page '{}' couldn't be converted to a valid number.\n".format( - quest, page)) + error_details.append(f'Minimum value given for the policy in question "{quest}" on page "{page}" could not be converted to a valid number.\n') if structure[page][quest]["policy"][2] == "": error_found = True - error_details.append( - "No maximum value was given for the policy in question '{}' on page '{}'.\n".format(quest, - page)) + error_details.append(f'No maximum value was given for the policy in question "{quest}" on page "{page}".\n') else: try: if structure[page][quest]["policy"][0] == "int": @@ -991,279 +912,206 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): float(structure[page][quest]["policy"][2]) except ValueError: error_found = True - error_details.append( - "Maximum value given for the policy in question '{}' on page '{}' couldn't be converted to a valid number.\n".format( - quest, page)) + error_details.append(f'Maximum value given for the policy in question "{quest}" on page "{page}" could not be converted to a valid number.\n') if structure[page][quest]["policy"][0] == "double": if structure[page][quest]["policy"][3] == "": error_found = True - error_details.append( - "No number of decimals was given for the policy in question '{}' on page '{}'.\n".format( - quest, page)) + error_details.append(f'No number of decimals was given for the policy in question "{quest}" on page "{page}".\n') else: try: int(structure[page][quest]["policy"][3]) except ValueError: error_found = True - error_details.append( - "Number of decimals given for the policy in question '{}' on page '{}' couldn't be converted to a number.\n".format( - quest, page)) + error_details.append(f'Number of decimals given for the policy in question "{quest}" on page "{page}" could not be converted to a number.\n') if structure[page][quest]["policy"][0] == "regex": if structure[page][quest]["policy"][1] == "": error_found = True - error_details.append( - "No regex was given for the policy in question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No regex was given for the policy in question "{quest}" on page "{page}".\n') else: try: re.compile(str(structure[page][quest]["policy"][1])) except re.error: error_found = True - error_details.append( - "An invalid regex was given for the policy in question '{}' on page '{}'.\n".format( - quest, page)) + error_details.append(f'An invalid regex was given for the policy in question "{quest}" on page "{page}".\n') if "start_cue" in structure[page][quest].keys(): if structure[page][quest]["start_cue"] == "": error_found = True - error_details.append( - "No start cue was given in question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No start cue was given in question "{quest}" on page "{page}".\n') else: try: int(structure[page][quest]["start_cue"]) except (ValueError, TypeError): error_found = True - error_details.append( - "Start cue given in question '{}' on page '{}' couldn't be converted to a number.\n".format( - quest, page)) + error_details.append(f'Start cue given in question "{quest}" on page "{page}" could not be converted to a number.\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Player" \ and "start_cue" not in structure[page][quest].keys(): error_found = True - error_details.append( - "No start cue was given in question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No start cue was given in question "{quest}" on page "{page}".\n') if "end_cue" in structure[page][quest].keys(): try: int(structure[page][quest]["end_cue"]) if "start_cue" in structure[page][quest].keys() and structure[page][quest]["start_cue"] == structure[page][quest]["end_cue"]: error_found = True - error_details.append( - "The same cue ({}) was used as start- and end-cue for one condition in question '{}' on page '{}'.\n".format( - structure[page][quest]["start_cue"], quest, page)) + error_details.append(f'The same cue ({structure[page][quest]["start_cue"]}) was used as start- and end-cue for one condition in question "{quest}" on page "{page}".\n') except (ValueError, TypeError): error_found = True - error_details.append( - "End cue given in question '{}' on page '{}' couldn't be converted to a number.\n".format( - quest, page)) + error_details.append(f'End cue given in question "{quest}" on page "{page}" could not be converted to a number.\n') if "track" in structure[page][quest].keys(): if structure[page][quest]["track"] == "": error_found = True - error_details.append( - "No track(s) was given for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No track(s) was given for question "{quest}" on page "{page}".\n') else: try: - if type(structure[page][quest]["track"]) == list or \ - type(structure[page][quest]["track"]) == tuple: + if isinstance(structure[page][quest]["track"], (list, tuple)): if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and ( len(structure[page][quest]["track"]) > 2 or len(structure[page][quest]["track"]) < 1): error_found = True - error_details.append( - "There should be 1 or 2 tracks for AB(X)-tests, but {} were given in question '{}' on page '{}'.\n".format( - len(structure[page][quest]["track"]), quest, page)) + error_details.append(f'There should be 1 or 2 tracks for AB(X)-tests, but {len(structure[page][quest]["track"])} were given in question "{quest}" on page "{page}".\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "MUSHRA" and \ len(structure[page][quest]["track"]) != len(structure[page][quest]["start_cues"]) and \ len(structure[page][quest]["track"]) > 1: error_found = True - error_details.append( - "The number of tracks given doesn't equal the number of cues given in question '{}' on page '{}'.\n".format( - quest, page)) + error_details.append(f'The number of tracks given does not equal the number of cues given in question "{quest}" on page "{page}".\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and len(structure[page][quest]["track"]) == 1: structure[page][quest]["track"].append(structure[page][quest]["track"][0]) for entry in range(len(structure[page][quest]["track"])): - if type(structure[page][quest]["track"][entry]) == str: - if type(structure[page][quest]["track"]) == tuple: + if isinstance(structure[page][quest]["track"][entry], str): + if isinstance(structure[page][quest]["track"], tuple): structure[page][quest]["track"] = list(structure[page][quest]["track"]) - structure[page][quest]["track"][entry] = structure[page][quest]["track"][ - entry].strip("' \"") + structure[page][quest]["track"][entry] = structure[page][quest]["track"][entry].strip("' \"") int(structure[page][quest]["track"][entry]) if int(structure[page][quest]["track"][entry]) < 1: error_found = True - error_details.append( - "Tracks given for question '{}' on page '{}' needs to be greater than 0.\n".format( - quest, page)) - elif type(structure[page][quest]["track"][entry]) == list: + error_details.append(f'Tracks given for question "{quest}" on page "{page}" needs to be greater than 0.\n') + elif isinstance(structure[page][quest]["track"][entry], list): if "type" in structure[page][quest].keys() and structure[page][quest]["type"] != "MUSHRA": error_found = True - error_details.append("Tracks given for question '{}' on page '{}' need to be one or more integers, not lists.\n".format( - quest, page)) + error_details.append(f'Tracks given for question "{quest}" on page "{page}" need to be one or more integers, not lists.\n') for entry2 in range(len(structure[page][quest]["track"][entry])): - if type(structure[page][quest]["track"][entry][entry2]) != int: - structure[page][quest]["track"][entry][entry2] = \ - structure[page][quest]["track"][entry][entry2].strip("' \"") + if not isinstance(structure[page][quest]["track"][entry][entry2], int): + structure[page][quest]["track"][entry][entry2] = structure[page][quest]["track"][entry][entry2].strip("' \"") int(structure[page][quest]["track"][entry][entry2]) if int(structure[page][quest]["track"][entry][entry2]) < 1: error_found = True - error_details.append( - "Tracks given for question '{}' on page '{}' needs to be greater than 0.\n".format( - quest, page)) + error_details.append(f'Tracks given for question "{quest}" on page "{page}" needs to be greater than 0.\n') else: # int if structure[page][quest]["track"][entry] < 1: error_found = True - error_details.append( - "Track given for question '{}' on page '{}' needs to be greater than 0.\n".format( - quest, page)) + error_details.append(f'Track given for question "{quest}" on page "{page}" needs to be greater than 0.\n') else: int(structure[page][quest]["track"]) if int(structure[page][quest]["track"]) < 1: error_found = True - error_details.append( - "Track given for question '{}' on page '{}' needs to be greater than 0.\n".format( - quest, page)) + error_details.append(f'Track given for question "{quest}" on page "{page}" needs to be greater than 0.\n') if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX": - structure[page][quest]["track"] = [structure[page][quest]["track"], - structure[page][quest]["track"]] + structure[page][quest]["track"] = [structure[page][quest]["track"], structure[page][quest]["track"]] except ValueError: error_found = True - error_details.append( - "Track(s) given for question '{}' on page '{}' couldn't be converted to a number or list of numbers.\n".format( - quest, page)) + error_details.append(f'Track(s) given for question "{quest}" on page "{page}" could not be converted to a number or list of numbers.\n') elif "type" in structure[page][quest].keys() and \ (structure[page][quest]["type"] == "Player" or structure[page][quest]["type"] == "MUSHRA" or structure[page][quest]["type"] == "ABX" or structure[page][quest]["type"] == "AFC") \ and "track" not in structure[page][quest].keys(): error_found = True - error_details.append( - "No track(s) was given for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No track(s) was given for question "{quest}" on page "{page}".\n') if "buttons" in structure[page][quest].keys(): if len(structure[page][quest]["buttons"]) == 0: warning_found = True - warning_details.append( - "No buttons are displayed for the player in question '{}' on page '{}'. It will play when this page is loaded.\n".format( - quest, page)) + warning_details.append(f'No buttons are displayed for the player in question "{quest}" on page "{page}". It will play when this page is loaded.\n') else: try: - if type(structure[page][quest]["buttons"]) is list or type( - structure[page][quest]["buttons"]) is tuple: + if isinstance(structure[page][quest]["buttons"], (list, tuple)): for button in structure[page][quest]["buttons"]: if button not in player_buttons: raise ValueError if "Play" not in structure[page][quest]["buttons"]: warning_found = True - warning_details.append( - "No Play button is displayed for the player in question '{}' on page '{}'. It will play when this page is loaded.\n".format( - quest, page)) - elif type(structure[page][quest]["buttons"]) is str: + warning_details.append(f'No Play button is displayed for the player in question "{quest}" on page "{page}". It will play when this page is loaded.\n') + elif isinstance(structure[page][quest]["buttons"], str): if structure[page][quest]["buttons"] not in player_buttons: raise ValueError elif "Play" != structure[page][quest]["buttons"]: warning_found = True - warning_details.append( - "No Play button is displayed for the player in question '{}' on page '{}'. It will play when this page is loaded.\n".format( - quest, page)) + warning_details.append(f'No Play button is displayed for the player in question "{quest}" on page "{page}". It will play when this page is loaded.\n') else: raise ValueError except ValueError: error_found = True - error_details.append( - "Invalid value found for 'buttons' for question '{}' on page '{}'.\n".format(quest, page)) - elif "type" in structure[page][quest].keys() and structure[page][quest][ - "type"] == "Player" and "buttons" not in structure[page][quest].keys(): + error_details.append(f'Invalid value found for "buttons" for question "{quest}" on page "{page}".\n') + elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Player" and "buttons" not in structure[page][quest].keys(): warning_found = True - warning_details.append( - "No buttons are displayed for the player in question '{}' on page '{}'. It will play when this page is loaded.\n".format( - quest, page)) + warning_details.append(f'No buttons are displayed for the player in question "{quest}" on page "{page}". It will play when this page is loaded.\n') if "start_cues" in structure[page][quest].keys(): if structure[page][quest]["start_cues"] == "": error_found = True - error_details.append( - "No start cues were given for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No start cues were given for question "{quest}" on page "{page}".\n') else: try: - if type(structure[page][quest]["start_cues"]) == list or \ - type(structure[page][quest]["start_cues"]) == tuple: + if isinstance(structure[page][quest]["start_cues"], (list, tuple)): for entry in range(len(structure[page][quest]["start_cues"])): - if type(structure[page][quest]["start_cues"][entry]) == str: - if type(structure[page][quest]["start_cues"]) == tuple: + if isinstance(structure[page][quest]["start_cues"][entry], str): + if isinstance(structure[page][quest]["start_cues"], tuple): structure[page][quest]["start_cues"] = list(structure[page][quest]["start_cues"]) structure[page][quest]["start_cues"][entry] = structure[page][quest]["start_cues"][entry].strip("' \"") int(structure[page][quest]["start_cues"][entry]) if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and (len(structure[page][quest]["start_cues"]) != 2): error_found = True - error_details.append( - "There should be exactly 2 start_cues for AB(X)-tests, but {} were given in question '{}' on page '{}'.\n".format( - 1 if type(structure[page][quest]["start_cues"]) == int else len( - structure[page][quest]["start_cues"]), quest, page)) + error_details.append(f'There should be exactly 2 start_cues for AB(X)-tests, but {1 if isinstance(structure[page][quest]["start_cues"], int) else len(structure[page][quest]["start_cues"])} were given in question "{quest}" on page "{page}".\n') else: int(structure[page][quest]["start_cues"]) if structure[page][quest]["type"] == "ABX": error_found = True - error_details.append( - "There should be exactly 2 start_cues for AB(X)-tests, but {} were given in question '{}' on page '{}'.\n".format( - 1 if type(structure[page][quest]["start_cues"]) == int else len( - structure[page][quest]["start_cues"]), quest, page)) + error_details.append(f'There should be exactly 2 start_cues for AB(X)-tests, but {1 if isinstance(structure[page][quest]["start_cues"], int) else len(structure[page][quest]["start_cues"])} were given in question "{quest}" on page "{page}".\n') + except ValueError: error_found = True - error_details.append( - "Start cues given for question '{}' on page '{}' couldn't be converted to a list of numbers.\n".format( - quest, page)) + error_details.append(f'Start cues given for question "{quest}" on page "{page}" could not be converted to a list of numbers.\n') elif "type" in structure[page][quest].keys() and (structure[page][quest]["type"] == "MUSHRA" or structure[page][quest]["type"] == "ABX" or structure[page][quest]["type"] == "AFC") \ and "start_cues" not in structure[page][quest].keys(): error_found = True - error_details.append("No start cues were given for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No start cues were given for question "{quest}" on page "{page}".\n') if "end_cues" in structure[page][quest].keys(): if structure[page][quest]["end_cues"] == "": error_found = True - error_details.append("No end cues were given for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No end cues were given for question "{quest}" on page "{page}".\n') else: try: - if type(structure[page][quest]["end_cues"]) == list or type( - structure[page][quest]["end_cues"]) == tuple: + if isinstance(structure[page][quest]["end_cues"], (list, tuple)): for entry in range(len(structure[page][quest]["end_cues"])): - if type(structure[page][quest]["end_cues"][entry]) == str: - if type(structure[page][quest]["end_cues"]) == tuple: + if isinstance(structure[page][quest]["end_cues"][entry], str): + if isinstance(structure[page][quest]["end_cues"], tuple): structure[page][quest]["end_cues"] = list(structure[page][quest]["end_cues"]) - structure[page][quest]["end_cues"][entry] = structure[page][quest]["end_cues"][ - entry].strip("' \"") + structure[page][quest]["end_cues"][entry] = structure[page][quest]["end_cues"][entry].strip("' \"") int(structure[page][quest]["end_cues"][entry]) else: int(structure[page][quest]["end_cues"]) except ValueError: error_found = True - error_details.append( - "End cues given for question '{}' on page '{}' couldn't be converted to a list of numbers.\n".format( - quest, page)) - if "start_cues" not in structure[page][quest].keys() or \ - len(structure[page][quest]["end_cues"]) != len(structure[page][quest]["start_cues"]): + error_details.append(f'End cues given for question "{quest}" on page "{page}" could not be converted to a list of numbers.\n') + if "start_cues" not in structure[page][quest].keys() or len(structure[page][quest]["end_cues"]) != len(structure[page][quest]["start_cues"]): error_found = True - error_details.append( - "The number of start- and end-cues in question '{}' on page '{}' doesn't match.\n".format( - quest, page)) - elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "MUSHRA" \ - and "end_cues" not in structure[page][quest].keys(): + error_details.append(f'The number of start- and end-cues in question "{quest}" on page "{page}" does not match.\n') + elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "MUSHRA" and "end_cues" not in structure[page][quest].keys(): error_found = True - error_details.append( - "No end cues were given for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No end cues were given for question "{quest}" on page "{page}".\n') if "start_cues" in structure[page][quest].keys() and "end_cues" in structure[page][quest].keys(): - if (type(structure[page][quest]["end_cues"]) == list or type( - structure[page][quest]["end_cues"]) == tuple) and ( - type(structure[page][quest]["start_cues"]) == list or - type(structure[page][quest]["start_cues"]) == tuple) and ( + if isinstance(structure[page][quest]["end_cues"], (list, tuple)) and isinstance(structure[page][quest]["start_cues"], (list, tuple)) and ( len(structure[page][quest]["start_cues"]) == len(structure[page][quest]["end_cues"])): for entry in range(len(structure[page][quest]["start_cues"])): - if int(structure[page][quest]["start_cues"][entry]) == int( - structure[page][quest]["end_cues"][entry]): + if int(structure[page][quest]["start_cues"][entry]) == int(structure[page][quest]["end_cues"][entry]): error_found = True - error_details.append( - "The same cue ({}) was used as start- and end-cue for one condition in question '{}' on page '{}'.\n".format( - structure[page][quest]["start_cues"][entry], quest, page)) + error_details.append(f'The same cue ({structure[page][quest]["start_cues"][entry]}) was used as start- and end-cue for one condition in question "{quest}" on page "{page}".\n') if "xfade" in structure[page][quest].keys(): try: @@ -1277,48 +1125,38 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): all_same_marker = False if not all_same_marker: error_found = True - error_details.append( - "Xfade is only applicable if all start- and end-markers are the same each in question '{}' on page '{}'.\n".format( - quest, page)) - if (type(structure[page][quest]["track"]) == int or type(structure[page][quest]["track"]) == str) or \ - ((type(structure[page][quest]["track"]) == list or type(structure[page][quest]["track"]) == tuple) and \ - (type(structure[page][quest]["track"][0]) == list and len(set(structure[page][quest]["track"][0])) == 1 or len(set(structure[page][quest]["track"])) == 1)): + error_details.append(f'Xfade is only applicable if all start- and end-markers are the same each in question "{quest}" on page "{page}".\n') + if isinstance(structure[page][quest]["track"], (int, str)) or \ + (isinstance(structure[page][quest]["track"], (list, tuple)) and + (isinstance(structure[page][quest]["track"][0], list) and len(set(structure[page][quest]["track"][0])) == 1 or len(set(structure[page][quest]["track"])) == 1)): error_found = True - error_details.append( - "For xfade stimuli need to be placed on different tracks in question '{}' on page '{}'.\n".format( - quest, page)) + error_details.append(f'For xfade stimuli need to be placed on different tracks in question "{quest}" on page "{page}".\n') except ValueError: error_found = True - error_details.append( - "No valid value found for 'xfade' for question '{}' on page '{}'.\n".format(quest, page)) - structure[page][quest][ - "xfade"] = False # This happens so the rest of the routine where xfade is referenced doesn't have to catch errors + error_details.append(f'No valid value found for "xfade" for question "{quest}" on page "{page}".\n') + structure[page][quest]["xfade"] = False # This happens so the rest of the routine where xfade is referenced does not have to catch errors if "crossfade" in structure[page][quest].keys(): try: structure[page][quest].as_bool("crossfade") except ValueError: error_found = True - error_details.append( - "No valid value found for 'crossfade' for question '{}' on page '{}'.\n".format(quest, page)) - structure[page][quest]["crossfade"] = False # This happens so the rest of the routine where crossfade is referenced doesn't have to catch errors + error_details.append(f'No valid value found for "crossfade" for question "{quest}" on page "{page}".\n') + structure[page][quest]["crossfade"] = False # This happens so the rest of the routine where crossfade is referenced does not have to catch errors if "inscription" in structure[page][quest].keys(): if structure[page][quest]["inscription"] == "": warning_found = True - warning_details.append( - "No inscription for the button in question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No inscription for the button in question "{quest}" on page "{page}".\n') elif structure[page][quest]["inscription"] == "None": warning_found = True - warning_details.append( - "Internally used inscription 'None' used in question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'Internally used inscription "None" used in question "{quest}" on page "{page}".\n') elif "type" in structure[page][quest].keys() and (structure[page][quest]["type"] == "Button" or structure[page][quest]["type"] == "OSCButton") and \ "inscription" not in structure[page][quest].keys(): structure[page][quest]["inscription"] = "" warning_found = True - warning_details.append( - "No inscription for the button in question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No inscription for the button in question "{quest}" on page "{page}".\n') if "type" in structure[page][quest].keys() and structure[page][quest]["type"] is not None: if structure[page][quest]["type"] == "Button" and ( @@ -1331,22 +1169,18 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): structure["audio_ip"] == "" or structure["audio_port"] == ""): warning_found = True - warning_details.append( - "This questionnaire uses MUSHRA, but no valid address for an audio-application is set.\n") + warning_details.append("This questionnaire uses MUSHRA, but no valid address for an audio-application is set.\n") if (structure[page][quest]["type"] == "Player" or structure[page][quest]["type"] == "ABX" or structure[page][quest]["type"] == "AFC") and \ ("audio_ip" not in structure.keys() or "audio_port" not in structure.keys() or structure["audio_ip"] == "" or structure["audio_port"] == ""): warning_found = True - warning_details.append( - "This questionnaire uses an audio player, but no valid address for an audio-application is set.\n") + warning_details.append("This questionnaire uses an audio player, but no valid address for an audio-application is set.\n") if structure[page][quest]["type"] == "Player" and "video" in structure[page][quest].keys() \ and ("video_ip" not in structure.keys() or "video_port" not in structure.keys() or structure["video_ip"] == "" or structure["video_port"] == ""): warning_found = True - warning_details.append( - "This questionnaire uses a video in question '{}' on page '{}', but no valid address for a video-application is set.\n".format( - quest, page)) + warning_details.append(f'This questionnaire uses a video in question "{quest}" on page "{page}", but no valid address for a video-application is set.\n') if (structure[page][quest]["type"] == "Button" or "pupil" in structure[page][quest].keys() and structure[page][quest]["pupil"] != "") and \ ("pupil_ip" not in structure.keys() or "pupil_port" not in structure.keys() or structure["pupil_ip"] == "" or structure["pupil_port"] == ""): @@ -1358,144 +1192,123 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): structure[page][quest]["objectName"] == "headline" or \ structure[page][quest]["objectName"] == "SliderHeader": warning_found = True - warning_details.append( - "The objectName in question '{}' on page '{}' uses a predefined name.\n".format(quest, page)) + warning_details.append(f'The objectName in question "{quest}" on page "{page}" uses a predefined name.\n') if "timer" in structure[page][quest].keys() and structure[page][quest]["timer"] != "": try: if int(structure[page][quest]["timer"]) < 0: warning_found = True - warning_details.append( - "The timer in question '{}' on page '{}' needs to be greater than or equal to 0. Setting it to 0 by default.\n".format(quest, page)) + warning_details.append(f'The timer in question "{quest}" on page "{page}" needs to be greater than or equal to 0. Setting it to 0 by default.\n') structure[page][quest]["timer"] = 0 except ValueError: error_found = True - error_details.append( - "The timer in question '{}' on page '{}' needs to be a numeric value.\n".format(quest, page)) + error_details.append(f'The timer in question "{quest}" on page "{page}" needs to be a numeric value.\n') if "password_file" in structure[page][quest].keys(): if structure[page][quest]["password_file"] == "": warning_found = True - warning_details.append( - "No password_file found for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No password_file found for question "{quest}" on page "{page}".\n') elif not path.isfile(structure[page][quest]["password_file"]): error_found = True - error_details.append( - "No valid password_file for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No valid password_file for question "{quest}" on page "{page}".\n') elif not validate_passwords(structure[page][quest]["password_file"], structure[page][quest]["policy"]): warning_found = True - warning_details.append( - "Passwords in file do not match policy of field for question '{}' on page '{}'.\n".format(quest, - page)) + warning_details.append(f'Passwords in file do not match policy of field for question "{quest}" on page "{page}".\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Password" and \ "password_file" not in structure[page][quest].keys(): structure[page][quest]["password_file"] = "" warning_found = True - warning_details.append( - "No password_file found for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No password_file found for question "{quest}" on page "{page}".\n') if "button_texts" in structure[page][quest].keys(): - if ((type(structure[page][quest]["button_texts"]) != list and type( - structure[page][quest]["button_texts"]) != tuple) and structure[page][quest][ - "button_texts"] != "") or \ - ((type(structure[page][quest]["button_texts"]) == list or type( - structure[page][quest]["button_texts"]) == tuple) and - ((len(structure[page][quest]["button_texts"]) != 2 and structure[page][quest].as_bool( - "x") == False) or - (len(structure[page][quest]["button_texts"]) != 3 and structure[page][quest].as_bool( - "x") == True))): + if (not isinstance(structure[page][quest]["button_texts"], list) and not isinstance(structure[page][quest]["button_texts"], tuple) and + structure[page][quest]["button_texts"] != "") or \ + (isinstance(structure[page][quest]["button_texts"], (list, tuple)) and + ((len(structure[page][quest]["button_texts"]) != 2 and not structure[page][quest].as_bool("x")) or + (len(structure[page][quest]["button_texts"]) != 3 and structure[page][quest].as_bool("x")))): error_found = True - error_details.append( - "Please give no, two or three (if option X is used) button_texts for the ABX type question '{}' on page '{}'.\n".format( - quest, page)) + error_details.append(f'Please give no, two or three (if option X is used) button_texts for the ABX type question "{quest}" on page "{page}".\n') if "randomize" in structure[page][quest].keys(): try: _ = structure[page][quest].as_bool("randomize") except ValueError: error_found = True - error_details.append( - "No valid value found for 'randomize' for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No valid value found for "randomize" for question "{quest}" on page "{page}".\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Matrix" and \ "randomize" not in structure[page][quest].keys(): structure[page][quest]["randomize"] = False warning_found = True - warning_details.append( - "No option for 'randomize' found for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No option for "randomize" found for question "{quest}" on page "{page}".\n') if "questions" in structure[page][quest].keys(): if structure[page][quest]["questions"] == "" or len(structure[page][quest]["questions"]) == 0: warning_found = True - warning_details.append( - "No questions for the matrix in question '{}' on page '{}' found.\n".format(quest, page)) + warning_details.append(f'No questions for the matrix in question "{quest}" on page "{page}" found.\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Matrix" and \ "questions" not in structure[page][quest].keys(): structure[page][quest]["questions"] = "" warning_found = True - warning_details.append( - "No questions for the matrix in question '{}' on page '{}' found.\n".format(quest, page)) + warning_details.append(f'No questions for the matrix in question "{quest}" on page "{page}" found.\n') if "image_file" in structure[page][quest].keys(): if structure[page][quest]["image_file"] == "": warning_found = True - warning_details.append( - "No image_file found for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No image_file found for question "{quest}" on page "{page}".\n') elif not path.isfile(structure[page][quest]["image_file"]): error_found = True - error_details.append( - "No valid image_file for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No valid image_file for question "{quest}" on page "{page}".\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Image" and \ "image_file" not in structure[page][quest].keys(): structure[page][quest]["image_file"] = "" warning_found = True - warning_details.append( - "No image_file found for question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No image_file found for question "{quest}" on page "{page}".\n') if "image_position" in structure[page][quest].keys(): if structure[page][quest]["image_position"] not in image_positions: error_found = True - error_details.append("Invalid image position found for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Invalid image position found for question "{quest}" on page "{page}".\n') elif structure[page][quest]["image_position"] == "free" and ("x_pos" not in structure[page][quest].keys() and "y_pos" not in structure[page][quest].keys()): warning_found = True - warning_details.append("Image '{}' on page '{}' is chosen to be positioned freely, but no coordinates were given.\n".format(quest, page)) + warning_details.append(f'Image "{quest}" on page "{page}" is chosen to be positioned freely, but no coordinates were given.\n') structure[page][quest]["x_pos"] = 0 if "x_pos" not in structure[page][quest].keys() else structure[page][quest]["x_pos"] structure[page][quest]["y_pos"] = 0 if "y_pos" not in structure[page][quest].keys() else structure[page][quest]["y_pos"] elif "image_position" not in structure[page][quest].keys() and "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Image": error_found = True - error_details.append("No image_position found for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No image_position found for question "{quest}" on page "{page}".\n') if "width" in structure[page][quest].keys(): try: int(structure[page][quest]["width"]) if int(structure[page][quest]["width"]) <= 0: error_found = True - error_details.append("Width needs to be bigger than 0 for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Width needs to be bigger than 0 for question "{quest}" on page "{page}".\n') except ValueError: error_found = True - error_details.append("Invalid value for width for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Invalid value for width for question "{quest}" on page "{page}".\n') if "height" in structure[page][quest].keys(): try: int(structure[page][quest]["height"]) if int(structure[page][quest]["height"]) <= 0: error_found = True - error_details.append("Height needs to be bigger than 0 for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Height needs to be bigger than 0 for question "{quest}" on page "{page}".\n') except ValueError: error_found = True - error_details.append("Height value for width for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Height value for width for question "{quest}" on page "{page}".\n') if "x_pos" in structure[page][quest].keys(): try: int(structure[page][quest]["x_pos"]) if int(structure[page][quest]["x_pos"]) < 0: error_found = True - error_details.append("X position needs to be bigger or equal to 0 for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'X position needs to be bigger or equal to 0 for question "{quest}" on page "{page}".\n') except ValueError: error_found = True - error_details.append("Invalid value for x position for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Invalid value for x position for question "{quest}" on page "{page}".\n') elif "image_position" in structure[page][quest].keys() and structure[page][quest]["image_position"] == "free": warning_found = True - warning_details.append("No x position given for the question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No x position given for the question "{quest}" on page "{page}".\n') structure[page][quest]["x_pos"] = 0 if "y_pos" in structure[page][quest].keys(): @@ -1503,53 +1316,52 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): int(structure[page][quest]["y_pos"]) if int(structure[page][quest]["y_pos"]) < 0: error_found = True - error_details.append("Y position needs to be bigger or equal to than 0 for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Y position needs to be bigger or equal to than 0 for question "{quest}" on page "{page}".\n') except ValueError: error_found = True - error_details.append("Invalid value for y position for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'Invalid value for y position for question "{quest}" on page "{page}".\n') elif "image_position" in structure[page][quest].keys() and structure[page][quest]["image_position"] == "free": warning_found = True - warning_details.append("No y position given for the question '{}' on page '{}'.\n".format(quest, page)) + warning_details.append(f'No y position given for the question "{quest}" on page "{page}".\n') structure[page][quest]["y_pos"] = 0 if "address" in structure[page][quest].keys(): if structure[page][quest]["address"] == "": error_found = True - error_details.append( - "No OSC-address for question '{}' on page '{}' was given.\n".format(quest, page)) + error_details.append(f'No OSC-address for question "{quest}" on page "{page}" was given.\n') elif not structure[page][quest]["address"].startswith("/"): warning_found = True - warning_details.append("The OSC-address of question '{}' on page '{}' should start with '/'.\n".format(quest, page)) + warning_details.append(f'The OSC-address of question "{quest}" on page "{page}" should start with "/".\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "OSCButton" and \ "address" not in structure[page][quest].keys(): error_found = True - error_details.append("No OSC-address for question '{}' on page '{}' was given.\n".format(quest, page)) + error_details.append(f'No OSC-address for question "{quest}" on page "{page}" was given.\n') if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "OSCButton" and \ "value" not in structure[page][quest].keys(): error_found = True - error_details.append("No value for question '{}' on page '{}' was given.\n".format(quest, page)) + error_details.append(f'No value for question "{quest}" on page "{page}" was given.\n') if "receiver" in structure[page][quest].keys(): - if type(structure[page][quest]["receiver"]) is not list and type(structure[page][quest]["receiver"]) is not tuple: + if not isinstance(structure[page][quest]["receiver"], list) and not isinstance(structure[page][quest]["receiver"], tuple): error_found = True - error_details.append("The receiver of question '{}' on page '{}' needs to have the format (IP, Port).\n".format(quest, page)) + error_details.append(f'The receiver of question "{quest}" on page "{page}" needs to have the format (IP, Port).\n') elif len(structure[page][quest]["receiver"]) > 0: match = re.match(ip_mask, structure[page][quest]["receiver"][0]) if match is None or match.span()[1] < len(structure[page][quest]["receiver"][0]): error_found = True - error_details.append("No valid IP address given for the receiver in question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No valid IP address given for the receiver in question "{quest}" on page "{page}".\n') try: int(structure[page][quest]["receiver"][1]) if int(structure[page][quest]["receiver"][1]) < 0 or int(structure[page][quest]["receiver"][1]) > 65535: raise ValueError except ValueError: error_found = True - error_details.append("Invalid receiver port in question '{}' on page '{}', couldn't be converted to a number 0-65535.\n".format(quest, page)) + error_details.append(f'Invalid receiver port in question "{quest}" on page "{page}", could not be converted to a number 0-65535.\n') elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "OSCButton" and \ "receiver" not in structure[page][quest].keys(): error_found = True - error_details.append("No receiver found for question '{}' on page '{}'.\n".format(quest, page)) + error_details.append(f'No receiver found for question "{quest}" on page "{page}".\n') # remove duplicate errors/warnings warning_details = list(dict.fromkeys(warning_details)) @@ -1580,5 +1392,5 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str): error_string += warn + "\n" msg.setDetailedText(error_string) if not suppress or error_found: - msg.exec_() + msg.exec() return error_found, warning_found, warning_details diff --git a/src/Video.py b/src/Video.py index df3f64fc43485a207213b2eef1b6eed867849fb9..41c66ee8c2675e6afc95c1a7e14003649bdef672 100644 --- a/src/Video.py +++ b/src/Video.py @@ -8,9 +8,9 @@ madmapper = { "pause": ["/pause", 1], "unpause": ["/play", 1], "reset": ["/medias/selected/position_sec", 0.0] - #"loop_on": ["/medias/selected/loop", True], # TBC - #"loop_off": ["/medias/selected/loop", False], # TBC - #"restart": ["/medias/selected/restart"] # TBC + # "loop_on": ["/medias/selected/loop", True], # TBC + # "loop_off": ["/medias/selected/loop", False], # TBC + # "restart": ["/medias/selected/restart"] # TBC } vlc = { diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/launcher.exe b/src/launcher.exe index 0edb316c5c55d085608c821c3508f6dc7ec6d967..a3e7b8f4f1ba1e5021d60807e669f33261557223 100644 Binary files a/src/launcher.exe and b/src/launcher.exe differ diff --git a/src/randomization.py b/src/randomization.py index 9bf5ea3e37b0ff9eb6d02af08332937dbbbce1a9..a8103d4ec80fb68f8323e405a0d6c7face427962 100644 --- a/src/randomization.py +++ b/src/randomization.py @@ -40,8 +40,8 @@ def order_from_file(file): """ with open(file) as f: orders = f.read().splitlines() - for row in range(0, len(orders)): - orders[row] = orders[row].split(",") + for row, order in enumerate(orders): + orders[row] = order.split(",") for entry in range(0, len(orders[row])): orders[row][entry] = int(orders[row][entry]) return orders diff --git a/src/tools.py b/src/tools.py index 38d9fadf2fa40130e96875b30a67c0b5c963d0a7..940b7f5e37bf3eafebd07654ba6d3f2880d91aa4 100644 --- a/src/tools.py +++ b/src/tools.py @@ -126,7 +126,7 @@ types = list(fields_per_type.keys()) policy_possibilities = ["None", "int", "double", "regex"] -function_possibilites = ["Annotate", "Recording", "Stop", "Calibration"] +function_possibilites = ["Annotate", "Recording", "Stop"] player_buttons = ["Play", "Pause", "Stop"] @@ -214,7 +214,7 @@ default_values = { "labelled": False, "buttons": player_buttons, "policy": ["None"], - "function": "Calibration", + "function": "Annotate", "inscription": "", "password_file": "", "button_texts": "", diff --git a/test/ABX_test.py b/test/ABX_test.py index 32ebe9a3048d0cb058a92a81bf50294c830673e9..7ebbe80e14b5b128ce22880c22ecbf96ba0337d6 100644 --- a/test/ABX_test.py +++ b/test/ABX_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of ABX.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, types, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, ABX, ast @pytest.fixture @@ -33,19 +33,19 @@ def run2(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -58,36 +58,36 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) gui_init.gui.questiontype.setCurrentIndex(types.index("ABX")) assert gui_init.gui.questiontype.currentText() == "ABX" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["ABX"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - fields_per_type["ABX"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["ABX"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + fields_per_type["ABX"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["ABX"][0].keys()) assert len(gui_init.undo_stack) == 12 # 2 for creating page & question, 10 for choosing ABX @@ -102,7 +102,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "ABX"} for key, value in default_values.items(): - if key in fields_per_type["ABX"][0].keys(): + if key in fields_per_type["ABX"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -132,8 +132,8 @@ def test_create(gui_init, qtbot): def test_button_texts(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -141,98 +141,98 @@ def test_button_texts(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) labels_pos = find_row_by_label(gui_load.gui.edit_layout, 'button_texts') - x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x') + x_pos = find_row_by_label(gui_load.gui.edit_layout, "x") - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("only one") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "only one" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("only one") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "only one" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("1") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "1" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "1" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, too many") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, too many" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, too many") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, too many" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "one, two, too many" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found # ABX - gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True - assert gui_load.structure["Page 1"]["Question 1"]["x"] == True - - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load.structure["Page 1"]["Question 1"]["x"] + + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "one, two" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, three, too many") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, three, too many" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, three, too many") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, three, too many" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "one, two, three, too many" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, not too many") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, not too many" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, not too many") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, not too many" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "one, two, not too many" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found QTimer.singleShot(150, handle_dialog_no_save) gui_load.close() @@ -240,8 +240,8 @@ def test_button_texts(gui_load, qtbot): def test_answers(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -249,84 +249,84 @@ def test_answers(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) ans_pos = find_row_by_label(gui_load.gui.edit_layout, 'answers') button_pos = find_row_by_label(gui_load.gui.edit_layout, 'button_texts') - x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x') + x_pos = find_row_by_label(gui_load.gui.edit_layout, "x") - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("only one") - assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "only one" - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("only one") + assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one" + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("1") - assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "1" - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1") + assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "1" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("one, two, too many") - assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "one, two, too many" - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, too many") + assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, too many" + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "one, two, too many" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # ABX - gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True - assert gui_load.structure["Page 1"]["Question 1"]["x"] == True - gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load.structure["Page 1"]["Question 1"]["x"] + gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "" - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("only one") - assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "only one" - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("only one") + assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one" + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("one, two, too many") - assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "one, two, too many" - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, too many") + assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, too many" + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "one, two, too many" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("one, two") - assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "one, two" - gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two") + assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two" + gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "one, two" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found QTimer.singleShot(150, handle_dialog_no_save) gui_load.close() @@ -341,70 +341,70 @@ def test_x(gui_load, qtbot): # It is not case sensitive. QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.structure["Page 1"]["Question 1"]["x"] = True QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found gui_load.structure["Page 1"]["Question 1"]["x"] = False QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.structure["Page 1"]["Question 1"]["x"] = "True" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found gui_load.structure["Page 1"]["Question 1"]["x"] = "False" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.structure["Page 1"]["Question 1"]["x"] = 1 QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found gui_load.structure["Page 1"]["Question 1"]["x"] = 0 QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.structure["Page 1"]["Question 1"]["x"] = "true" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found gui_load.structure["Page 1"]["Question 1"]["x"] = "false" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.structure["Page 1"]["Question 1"]["x"] = 123 QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found gui_load.close() def test_start_cues(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -412,115 +412,115 @@ def test_start_cues(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) sc_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_cues') button_pos = find_row_by_label(gui_load.gui.edit_layout, 'button_texts') - x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x') + x_pos = find_row_by_label(gui_load.gui.edit_layout, "x") - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1, 2, 3") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1, 2, 3" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2, 3") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1, 2, 3" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1, 2") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1, 2" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1, 2" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("'1', 2") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "'1', 2" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1', 2") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1', 2" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "'1', 2" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1, '2'") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1, '2'" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, '2'") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, '2'" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1, '2'" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found # ABX - gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True - assert gui_load.structure["Page 1"]["Question 1"]["x"] == True - gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load.structure["Page 1"]["Question 1"]["x"] + gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1, 2, 3") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1, 2, 3" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2, 3") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1, 2, 3" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("'1', 2") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "'1', 2" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1', 2") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1', 2" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "'1', 2" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found QTimer.singleShot(150, handle_dialog_no_save) gui_load.close() @@ -528,8 +528,8 @@ def test_start_cues(gui_load, qtbot): def test_track(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -537,126 +537,126 @@ def test_track(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) track_pos = find_row_by_label(gui_load.gui.edit_layout, 'track') button_pos = find_row_by_label(gui_load.gui.edit_layout, 'button_texts') - x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x') + x_pos = find_row_by_label(gui_load.gui.edit_layout, "x") - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1, 2, 3") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1, 2, 3" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2, 3") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1, 2, 3" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1, 2") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1, 2" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1, 2" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("'1', 2") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "'1', 2" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1', 2") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1', 2" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "'1', 2" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("'1','2'") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "'1','2'" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1','2'") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1','2'" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "'1','2'" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,'2'") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,'2'" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,'2'") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,'2'" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,'2'" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found # ABX - gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True - assert gui_load.structure["Page 1"]["Question 1"]["x"] == True - gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load.structure["Page 1"]["Question 1"]["x"] + gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1, 2, 3") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1, 2, 3" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2, 3") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1, 2, 3" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("'1',2") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "'1',2" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1',2") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1',2" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "'1',2" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found QTimer.singleShot(150, handle_dialog_no_save) gui_load.close() @@ -665,7 +665,7 @@ def test_track(gui_load, qtbot): def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_abx.csv', mode='r') as file: @@ -674,12 +674,12 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines assert len(results) == 7 - assert lines[0] == '1' # participant number - assert lines[2] == '-1' # no answer given in button group - assert lines[3] == '[]' # first element not played - assert lines[4] == '[]' # second element not played - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6]) # timestamp + assert results[0] == '1' # participant number + assert results[2] == '-1' # no answer given in button group + assert results[3] == '[]' # first element not played + assert results[4] == '[]' # second element not played + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6]) # timestamp os.remove("./test/results/results_abx.csv") @@ -688,11 +688,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_abx.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -700,20 +700,20 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == '1_order' - assert lines[2] == '1_answer' - assert lines[3] == '1_duration_A' - assert lines[4] == '1_duration_B' - assert lines[5] == 'Start' - assert lines[6] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == '1_order' + assert results[2] == '1_answer' + assert results[3] == '1_duration_A' + assert results[4] == '1_duration_B' + assert results[5] == 'Start' + assert results[6] == 'End' assert len(results) == 7 - assert lines[0] == '-1' # participant number unknown - assert lines[2] == '-1' # no answer given in button group - assert lines[3] == '[]' # first element not played - assert lines[4] == '[]' # second element not played - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[2] == '-1' # no answer given in button group + assert results[3] == '[]' # first element not played + assert results[4] == '[]' # second element not played + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6]) # timestamp os.remove(res_file) @@ -721,16 +721,16 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): def test_execute_questionnaire_ab(run, qtbot): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == ABX: - QTest.mouseClick(child.a_button.play_button, Qt.LeftButton) + if isinstance(child, ABX): + QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(1000) - QTest.mouseClick(child.b_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.a_button.play_button, Qt.LeftButton) - QTest.mouseClick(child.answer.button(0), Qt.LeftButton, delay=1) + QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton) + QTest.mouseClick(child.answer.button(0), Qt.MouseButton.LeftButton, delay=1000) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_abx.csv', mode='r') as file: @@ -739,22 +739,22 @@ def test_execute_questionnaire_ab(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == '1_order' - assert lines[2] == '1_answer' - assert lines[3] == '1_duration_A' - assert lines[4] == '1_duration_B' - assert lines[5] == 'Start' - assert lines[6] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == '1_order' + assert results[2] == '1_answer' + assert results[3] == '1_duration_A' + assert results[4] == '1_duration_B' + assert results[5] == 'Start' + assert results[6] == 'End' assert len(results) == 7 - assert lines[0] == '1' # participant number - assert lines[2] == '0' # first answer given in button group - assert len(ast.literal_eval(lines[3])) == 2 # first element played twice - assert float(ast.literal_eval(lines[3])[0]) > 1.0 - assert len(ast.literal_eval(lines[4])) == 1 # second element played once - assert float(ast.literal_eval(lines[4])[0]) > 0.5 - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6]) # timestamp + assert results[0] == '1' # participant number + assert results[2] == '0' # first answer given in button group + assert len(ast.literal_eval(results[3])) == 2 # first element played twice + assert float(ast.literal_eval(results[3])[0]) > 1.0 + assert len(ast.literal_eval(results[4])) == 1 # second element played once + assert float(ast.literal_eval(results[4])[0]) > 0.5 + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6]) # timestamp os.remove("./test/results/results_abx.csv") @@ -763,19 +763,19 @@ def test_execute_questionnaire_blocked(run, qtbot): with mock_file(r'./test/results/results_abx.csv'): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == ABX: - QTest.mouseClick(child.a_button.play_button, Qt.LeftButton) + if isinstance(child, ABX): + QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(1000) - QTest.mouseClick(child.b_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.a_button.play_button, Qt.LeftButton) - QTest.mouseClick(child.answer.button(0), Qt.LeftButton, delay=1) + QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton) + QTest.mouseClick(child.answer.button(0), Qt.MouseButton.LeftButton, delay=1000) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -783,22 +783,22 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == '1_order' - assert lines[2] == '1_answer' - assert lines[3] == '1_duration_A' - assert lines[4] == '1_duration_B' - assert lines[5] == 'Start' - assert lines[6] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == '1_order' + assert results[2] == '1_answer' + assert results[3] == '1_duration_A' + assert results[4] == '1_duration_B' + assert results[5] == 'Start' + assert results[6] == 'End' assert len(results) == 7 - assert lines[0] == '-1' # participant number unknown - assert lines[2] == '0' # first answer given in button group - assert len(ast.literal_eval(lines[3])) == 2 # first element played twice - assert float(ast.literal_eval(lines[3])[0]) > 1.0 - assert len(ast.literal_eval(lines[4])) == 1 # second element played once - assert float(ast.literal_eval(lines[4])[0]) > 0.5 - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[2] == '0' # first answer given in button group + assert len(ast.literal_eval(results[3])) == 2 # first element played twice + assert float(ast.literal_eval(results[3])[0]) > 1.0 + assert len(ast.literal_eval(results[4])) == 1 # second element played once + assert float(ast.literal_eval(results[4])[0]) > 0.5 + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6]) # timestamp os.remove(res_file) @@ -807,7 +807,7 @@ def test_execute_questionnaire_no_interaction_x(run2, qtbot): assert run2.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run2.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_abx.csv', mode='r') as file: @@ -816,13 +816,13 @@ def test_execute_questionnaire_no_interaction_x(run2, qtbot): for lines in csv_file: results = lines assert len(results) == 8 - assert lines[0] == '1' # participant number - assert lines[2] == '-1' # no answer given in button group - assert lines[3] == '[]' # first element not played - assert lines[4] == '[]' # second element not played - assert lines[5] == '[]' # x not played - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7]) # timestamp + assert results[0] == '1' # participant number + assert results[2] == '-1' # no answer given in button group + assert results[3] == '[]' # first element not played + assert results[4] == '[]' # second element not played + assert results[5] == '[]' # x not played + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7]) # timestamp os.remove("./test/results/results_abx.csv") @@ -831,11 +831,11 @@ def test_execute_questionnaire_no_interaction_x_blocked(run2, qtbot): with mock_file(r'./test/results/results_abx.csv'): assert run2.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run2.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -843,22 +843,22 @@ def test_execute_questionnaire_no_interaction_x_blocked(run2, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == '1_order' - assert lines[2] == '1_answer' - assert lines[3] == '1_duration_A' - assert lines[4] == '1_duration_B' - assert lines[5] == '1_duration_X' - assert lines[6] == 'Start' - assert lines[7] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == '1_order' + assert results[2] == '1_answer' + assert results[3] == '1_duration_A' + assert results[4] == '1_duration_B' + assert results[5] == '1_duration_X' + assert results[6] == 'Start' + assert results[7] == 'End' assert len(results) == 8 - assert lines[0] == '-1' # participant number unknown - assert lines[2] == '-1' # no answer given in button group - assert lines[3] == '[]' # first element not played - assert lines[4] == '[]' # second element not played - assert lines[5] == '[]' # x not played - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[2] == '-1' # no answer given in button group + assert results[3] == '[]' # first element not played + assert results[4] == '[]' # second element not played + assert results[5] == '[]' # x not played + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7]) # timestamp os.remove(res_file) @@ -866,23 +866,23 @@ def test_execute_questionnaire_no_interaction_x_blocked(run2, qtbot): def test_execute_questionnaire_abx(run2, qtbot): assert run2.Stack.count() == 1 for child in run2.Stack.currentWidget().children(): - if type(child) == ABX: - QTest.mouseClick(child.x_button.play_button, Qt.LeftButton) + if isinstance(child, ABX): + QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.a_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(1000) - QTest.mouseClick(child.x_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.b_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.x_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.b_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(2000) - QTest.mouseClick(child.answer.button(0), Qt.LeftButton, delay=1) + QTest.mouseClick(child.answer.button(0), Qt.MouseButton.LeftButton, delay=1000) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run2.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_abx.csv', mode='r') as file: @@ -891,22 +891,22 @@ def test_execute_questionnaire_abx(run2, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == '1_order' - assert lines[2] == '1_answer' - assert lines[3] == '1_duration_A' - assert lines[4] == '1_duration_B' - assert lines[5] == '1_duration_X' - assert lines[6] == 'Start' - assert lines[7] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == '1_order' + assert results[2] == '1_answer' + assert results[3] == '1_duration_A' + assert results[4] == '1_duration_B' + assert results[5] == '1_duration_X' + assert results[6] == 'Start' + assert results[7] == 'End' assert len(results) == 8 - assert lines[0] == '1' # participant number - assert lines[2] == '0' # first answer given in button group - assert len(ast.literal_eval(lines[3])) == 1 # first element played once - assert len(ast.literal_eval(lines[4])) == 2 # second element played twice - assert len(ast.literal_eval(lines[5])) == 3 # third (x) element played three times - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7]) # timestamp + assert results[0] == '1' # participant number + assert results[2] == '0' # first answer given in button group + assert len(ast.literal_eval(results[3])) == 1 # first element played once + assert len(ast.literal_eval(results[4])) == 2 # second element played twice + assert len(ast.literal_eval(results[5])) == 3 # third (x) element played three times + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7]) # timestamp os.remove("./test/results/results_abx.csv") @@ -915,26 +915,26 @@ def test_execute_questionnaire_abx_blocked(run2, qtbot): with mock_file(r'./test/results/results_abx.csv'): assert run2.Stack.count() == 1 for child in run2.Stack.currentWidget().children(): - if type(child) == ABX: - QTest.mouseClick(child.x_button.play_button, Qt.LeftButton) + if isinstance(child, ABX): + QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.a_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(1000) - QTest.mouseClick(child.x_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.b_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.x_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(500) - QTest.mouseClick(child.b_button.play_button, Qt.LeftButton) + QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton) QTest.qWait(2000) - QTest.mouseClick(child.answer.button(0), Qt.LeftButton, delay=1) + QTest.mouseClick(child.answer.button(0), Qt.MouseButton.LeftButton, delay=1000) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run2.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -942,20 +942,20 @@ def test_execute_questionnaire_abx_blocked(run2, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == '1_order' - assert lines[2] == '1_answer' - assert lines[3] == '1_duration_A' - assert lines[4] == '1_duration_B' - assert lines[5] == '1_duration_X' - assert lines[6] == 'Start' - assert lines[7] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == '1_order' + assert results[2] == '1_answer' + assert results[3] == '1_duration_A' + assert results[4] == '1_duration_B' + assert results[5] == '1_duration_X' + assert results[6] == 'Start' + assert results[7] == 'End' assert len(results) == 8 - assert lines[0] == '-1' # participant number unknown - assert lines[2] == '0' # first answer given in button group - assert len(ast.literal_eval(lines[3])) == 1 # first element played once - assert len(ast.literal_eval(lines[4])) == 2 # second element played twice - assert len(ast.literal_eval(lines[5])) == 3 # third (x) element played three times - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[2] == '0' # first answer given in button group + assert len(ast.literal_eval(results[3])) == 1 # first element played once + assert len(ast.literal_eval(results[4])) == 2 # second element played twice + assert len(ast.literal_eval(results[5])) == 3 # third (x) element played three times + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7]) # timestamp os.remove(res_file) diff --git a/test/Button_test.py b/test/Button_test.py index d19954d8b2ad5c6b56ab29ab9b900f396d3603ea..d16ba1d8e9b3cca27fadae67f9c135674dc502d0 100644 --- a/test/Button_test.py +++ b/test/Button_test.py @@ -1,6 +1,7 @@ """Testing the behaviour of PupilCoreButton.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, open_pupil, Button, handle_dialog_warning + recording_path = "C:\\Users\\Administrator\\recordings\\" # TODO change to your path @@ -40,19 +41,18 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True - QTest.qWait(500) + assert gui_init.gui.question_add.isEnabled() QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -65,33 +65,33 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Button" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Button"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Button"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["Button"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Button"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Button"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["Button"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["Button"][0].keys()) assert len(gui_init.undo_stack) == 9 # 2 for creating page & question, 7 for choosing Button @@ -106,7 +106,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Button"} for key, value in default_values.items(): - if key in fields_per_type["Button"][0].keys(): + if key in fields_per_type["Button"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -137,8 +137,8 @@ def test_create(gui_init, qtbot): def test_inscription(gui_load, qtbot, capfd): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -146,110 +146,111 @@ def test_inscription(gui_load, qtbot, capfd): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) ins_pos = find_row_by_label(gui_load.gui.edit_layout, 'inscription') # change text - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("Click me") - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Click me" - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Click me") + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Click me" + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Click me" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Click me" + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Click me" assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Click me" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/pbtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: + if isinstance(child, Button): assert child.button.text() == "Click me" QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() # empty inscription -> warning - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("") - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "" - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("") + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "" + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) QTimer.singleShot(500, handle_dialog_warning) test_gui = StackedWindowGui("./test/pbtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: + if isinstance(child, Button): assert child.button.text() == "" child.button.click() QTest.qWait(1000) out, err = capfd.readouterr() assert out.index("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") != -1 - assert out.endswith(", 'duration': 1} Message forwarded.\n") == True + assert out.endswith(", 'duration': 1} Message forwarded.\n") + QTimer.singleShot(1000, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() # predefined 'None' - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("None") - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "None" - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("None") + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "None" + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "None" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "None" + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "None" assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "None" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) QTimer.singleShot(150, handle_dialog_warning) test_gui = StackedWindowGui("./test/pbtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: + if isinstance(child, Button): assert child.button.text() == "None" child.button.click() QTest.qWait(500) out, err = capfd.readouterr() assert out.index("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") != -1 - assert out.endswith(", 'duration': 1} Message forwarded.\n") == True + assert out.endswith(", 'duration': 1} Message forwarded.\n") QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() # reset file - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("Text") - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Text" - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Text") + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Text" + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Text" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Text" + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Text" assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Text" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) os.remove("./test/results/results_pb.csv") gui_load.close() @@ -260,8 +261,8 @@ def test_inscription(gui_load, qtbot, capfd): def test_custom_annotation_text(gui_load, qtbot, capfd): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -269,7 +270,7 @@ def test_custom_annotation_text(gui_load, qtbot, capfd): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) # change text gui_load.structure["Page 1"]["Question 1"]["annotation"] = "Custom text" @@ -279,33 +280,33 @@ def test_custom_annotation_text(gui_load, qtbot, capfd): assert gui_load.structure["Page 1"]["Question 1"]["annotation"] == "Custom text" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["annotation"] == "Custom text" - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/pbtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: + if isinstance(child, Button): child.button.click() out, err = capfd.readouterr() assert out.index("Trigger {'topic': 'annotation', 'label': 'Custom text', 'timestamp':") != -1 - assert out.endswith(", 'duration': 1} Message forwarded.\n") == True + assert out.endswith(", 'duration': 1} Message forwarded.\n") QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() gui_load.structure["Page 1"]["Question 1"].pop("annotation") assert "annotation" not in gui_load.structure["Page 1"]["Question 1"].keys() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert "annotation" not in gui_load.structure["Page 1"]["Question 1"].keys() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.close() @@ -314,8 +315,8 @@ def test_custom_annotation_text(gui_load, qtbot, capfd): def test_custom_recording_name(gui_load, qtbot, capfd): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -323,18 +324,18 @@ def test_custom_recording_name(gui_load, qtbot, capfd): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) func_pos = find_row_by_label(gui_load.gui.edit_layout, 'function') - func_cb = gui_load.gui.edit_layout.itemAt(func_pos, 1).widget() + func_cb = gui_load.gui.edit_layout.itemAt(func_pos, QFormLayout.ItemRole.FieldRole).widget() - QTest.mouseClick(func_cb, Qt.LeftButton) - QTest.keyClick(func_cb, Qt.Key_Down) - QTest.keyClick(func_cb, Qt.Key_Enter) + QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(func_cb, Qt.Key.Key_Down) + QTest.keyClick(func_cb, Qt.Key.Key_Enter) assert func_cb.currentText() == "Recording" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["function"] == "Recording" @@ -346,38 +347,38 @@ def test_custom_recording_name(gui_load, qtbot, capfd): assert gui_load.structure["Page 1"]["Question 1"]["recording_name"] == "MyRecording" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["recording_name"] == "MyRecording" - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/pbtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: + if isinstance(child, Button): child.button.click() out, err = capfd.readouterr() - assert out.endswith("MyRecording\nStart recording... OK\n") == True + assert out.endswith("MyRecording\nStart recording... OK\n") test_gui.pupil_remote.send_string('r') print("Stop recording...", test_gui.pupil_remote.recv_string()) QTimer.singleShot(500, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() - assert os.path.exists(recording_path+"MyRecording") == True + assert os.path.exists(f'{recording_path}MyRecording') # os.remove(recording_path+"MyRecording") - QTest.mouseClick(func_cb, Qt.LeftButton) - QTest.keyClick(func_cb, Qt.Key_Up) - QTest.keyClick(func_cb, Qt.Key_Enter) + QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(func_cb, Qt.Key.Key_Up) + QTest.keyClick(func_cb, Qt.Key.Key_Enter) assert func_cb.currentText() == "Annotate" gui_load.structure["Page 1"]["Question 1"].pop("recording_name") assert "recording_name" not in gui_load.structure["Page 1"]["Question 1"].keys() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert "recording_name" not in gui_load.structure["Page 1"]["Question 1"].keys() gui_load.save() @@ -389,8 +390,8 @@ def test_custom_recording_name(gui_load, qtbot, capfd): def test_custom_recording_name_id(gui_load2, qtbot, capfd): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load2.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -398,9 +399,9 @@ def test_custom_recording_name_id(gui_load2, qtbot, capfd): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) func_pos = find_row_by_label(gui_load2.gui.edit_layout, 'function') - func_cb = gui_load2.gui.edit_layout.itemAt(func_pos, 1).widget() + func_cb = gui_load2.gui.edit_layout.itemAt(func_pos, QFormLayout.ItemRole.FieldRole).widget() assert func_cb.currentText() == "Recording" assert gui_load2.structure["Page 1"]["Question 1"]["function"] == "Recording" @@ -413,31 +414,33 @@ def test_custom_recording_name_id(gui_load2, qtbot, capfd): assert gui_load2.structure["Page 1"]["Question 1"]["recording_name"] == "id:tf" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load2.gui.refresh_button.click() assert gui_load2.structure["Page 1"]["Question 1"]["recording_name"] == "id:tf" - QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/pbtest2.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == QLineEdit: + if isinstance(child, QLineEdit): # noinspection PyTypeChecker - QTest.keyClicks(child, "test", Qt.NoModifier, delay=1) + QTest.keyClicks(child, "test", Qt.KeyboardModifier.NoModifier, delay=1000) assert child.text() == "test" + QTest.qWait(1000) for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: + if isinstance(child, Button): child.button.click() out, err = capfd.readouterr() - assert out.endswith("test\nStart recording... OK\n") == True + assert out.endswith("\nStart recording... OK\n") + QTest.qWait(500) test_gui.pupil_remote.send_string('r') print("Stop recording...", test_gui.pupil_remote.recv_string()) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() - assert os.path.exists(recording_path+"test") == True + assert os.path.exists(f'{recording_path}test') # os.remove(recording_path+"test") gui_load2.structure["Page 1"]["Question 1"].pop("recording_name") @@ -452,8 +455,8 @@ def test_custom_recording_name_id(gui_load2, qtbot, capfd): def test_function(gui_load, qtbot, capfd): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -461,88 +464,66 @@ def test_function(gui_load, qtbot, capfd): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) func_pos = find_row_by_label(gui_load.gui.edit_layout, 'function') - func_cb = gui_load.gui.edit_layout.itemAt(func_pos, 1).widget() + func_cb = gui_load.gui.edit_layout.itemAt(func_pos, QFormLayout.ItemRole.FieldRole).widget() assert func_cb.currentText() == 'Annotate' - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/pbtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: + if isinstance(child, Button): child.button.click() out, err = capfd.readouterr() assert out.index("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") != -1 - assert out.endswith(", 'duration': 1} Message forwarded.\n") == True + assert out.endswith(", 'duration': 1} Message forwarded.\n") QTest.qWait(500) test_gui.close() - QTest.mouseClick(func_cb, Qt.LeftButton) - QTest.keyClick(func_cb, Qt.Key_Down) - QTest.keyClick(func_cb, Qt.Key_Enter) + QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(func_cb, Qt.Key.Key_Down) + QTest.keyClick(func_cb, Qt.Key.Key_Enter) assert func_cb.currentText() == "Recording" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["function"] == "Recording" gui_load.save() test_gui = StackedWindowGui("./test/pbtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: + if isinstance(child, Button): child.button.click() out, err = capfd.readouterr() - assert out.endswith("Start recording... OK\n") == True + assert out.endswith("Start recording... OK\n") QTest.qWait(500) test_gui.close() - QTest.mouseClick(func_cb, Qt.LeftButton) - QTest.keyClick(func_cb, Qt.Key_Down) - QTest.keyClick(func_cb, Qt.Key_Enter) + QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(func_cb, Qt.Key.Key_Down) + QTest.keyClick(func_cb, Qt.Key.Key_Enter) assert func_cb.currentText() == "Stop" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() gui_load.save() test_gui = StackedWindowGui("./test/pbtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: + if isinstance(child, Button): child.button.click() out, err = capfd.readouterr() - assert out.endswith("Stop recording... OK\n") == True + assert out.endswith("Stop recording... OK\n") QTest.qWait(500) test_gui.close() - QTest.mouseClick(func_cb, Qt.LeftButton) - QTest.keyClick(func_cb, Qt.Key_Down) - QTest.keyClick(func_cb, Qt.Key_Enter) - assert func_cb.currentText() == "Calibration" - QTimer.singleShot(150, handle_dialog_error) - error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - gui_load.gui.refresh_button.click() - gui_load.save() - ''' - test_gui = StackedWindowGui("./test/pbtest.txt") - for child in test_gui.Stack.currentWidget().children(): - if type(child) == Button: - child.button.click() - out, err = capfd.readouterr() - assert out.endswith("Calibrate... OK\n") == True - QTest.qWait(5000) - test_gui.close() - ''' - - QTest.mouseClick(func_cb, Qt.LeftButton) - QTest.keyClick(func_cb, Qt.Key_Up) - QTest.keyClick(func_cb, Qt.Key_Up) - QTest.keyClick(func_cb, Qt.Key_Up) - QTest.keyClick(func_cb, Qt.Key_Enter) + QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(func_cb, Qt.Key.Key_Up) + QTest.keyClick(func_cb, Qt.Key.Key_Up) + QTest.keyClick(func_cb, Qt.Key.Key_Enter) assert func_cb.currentText() == 'Annotate' - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.save() os.remove("./test/results/results_pb.csv") gui_load.close() @@ -556,7 +537,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_pb.csv', mode='r') as file: @@ -565,15 +546,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pb' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pb' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == 'False' # the button was not clicked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'False' # the button was not clicked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pb.csv") @@ -582,11 +563,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_pb.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -594,15 +575,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pb' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pb' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == 'False' # the button was not clicked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == 'False' # the button was not clicked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) @@ -613,14 +594,14 @@ def test_execute_questionnaire(run, qtbot, capfd): os.remove("./test/results/results_pb.csv") assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) is Button: + if isinstance(child, Button): child.button.click() out, err = capfd.readouterr() - assert out.startswith("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") == True - assert out.endswith(", 'duration': 1} Message forwarded.\n") == True + assert out.startswith("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") + assert out.endswith(", 'duration': 1} Message forwarded.\n") QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_pb.csv', mode='r') as file: @@ -629,15 +610,15 @@ def test_execute_questionnaire(run, qtbot, capfd): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pb' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pb' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == 'True' # button was clicked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'True' # button was clicked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pb.csv") @@ -647,17 +628,17 @@ def test_execute_questionnaire_blocked(run, qtbot, capfd): with mock_file(r'./test/results/results_pb.csv'): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) is Button: + if isinstance(child, Button): child.button.click() out, err = capfd.readouterr() - assert out.startswith("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") == True - assert out.endswith(", 'duration': 1} Message forwarded.\n") == True + assert out.startswith("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") + assert out.endswith(", 'duration': 1} Message forwarded.\n") QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -665,13 +646,13 @@ def test_execute_questionnaire_blocked(run, qtbot, capfd): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pb' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pb' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == 'True' # the button was not clicked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == 'True' # the button was not clicked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) diff --git a/test/CheckBox_test.py b/test/CheckBox_test.py index d5786b3fcfb75923a191b655bf533d9d1fd7bbca..7bbf7fdc2a006598a7d220bfe3b516ce97c6746b 100644 --- a/test/CheckBox_test.py +++ b/test/CheckBox_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of Answer_Checkbox.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, make_answers_cb @pytest.fixture @@ -27,19 +27,19 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -52,28 +52,28 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Check" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Check"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Check"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["Check"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Check"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Check"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["Check"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["Check"][0].keys()) assert len(gui_init.undo_stack) == 4 # 2 for creating page & question, 2 for choosing Check @@ -88,7 +88,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Check"} for key, value in default_values.items(): - if key in fields_per_type["Check"][0].keys(): + if key in fields_per_type["Check"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -118,8 +118,8 @@ def test_create(gui_init, qtbot): def test_answers(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -127,63 +127,65 @@ def test_answers(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'answers') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[only one]") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[only one]") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[only one]" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]" + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]" assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one" # structure got listified with refresh QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"]) + assert not error_found + assert not warning_found + _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.structure["Page 1"]["Question 1"]["id"]) assert len(cbs) == 1 - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("only one") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "only one" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("only one") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"]) + assert not error_found + assert not warning_found + _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.structure["Page 1"]["Question 1"]["id"]) assert len(cbs) == 1 - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[one, two, three]") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[one, two, three]" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[one, two, three]") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[one, two, three]" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[one, two, three]" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert gui_load.structure["Page 1"]["Question 1"]["answers"] == ["one", "two", "three"] - _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"]) + _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.structure["Page 1"]["Question 1"]["id"]) assert len(cbs) == 3 - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"]) + assert not error_found + assert warning_found + _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.structure["Page 1"]["Question 1"]["id"]) assert len(cbs) == 1 - QTimer.singleShot(150, handle_dialog_no_save) + + gui_load.structure["Page 1"]["Question 1"]["answers"] = ["yes", " no", " maybe"] + gui_load.save() gui_load.close() @@ -192,7 +194,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_cb.csv', mode='r') as file: @@ -201,20 +203,21 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'cb1_0' - assert lines[2] == 'cb1_1' - assert lines[3] == 'cb1_2' - assert lines[4] == 'Start' - assert lines[5] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'cb1_0' + assert results[2] == 'cb1_1' + assert results[3] == 'cb1_2' + assert results[4] == 'Start' + assert results[5] == 'End' assert len(results) == 6 - assert lines[0] == '1' # participant number - assert lines[1] == 'False' # first cb not checked - assert lines[2] == 'False' # second cb not checked - assert lines[3] == 'False' # third cb not checked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'False' # first cb not checked + assert results[2] == 'False' # second cb not checked + assert results[3] == 'False' # third cb not checked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove("./test/results/results_cb.csv") + QTest.qWait(5000) # noinspection PyArgumentList @@ -222,11 +225,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_cb.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -234,20 +237,21 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'cb1_0' - assert lines[2] == 'cb1_1' - assert lines[3] == 'cb1_2' - assert lines[4] == 'Start' - assert lines[5] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'cb1_0' + assert results[2] == 'cb1_1' + assert results[3] == 'cb1_2' + assert results[4] == 'Start' + assert results[5] == 'End' assert len(results) == 6 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == 'False' # first cb not checked - assert lines[2] == 'False' # second cb not checked - assert lines[3] == 'False' # third cb not checked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == 'False' # first cb not checked + assert results[2] == 'False' # second cb not checked + assert results[3] == 'False' # third cb not checked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove(res_file) + QTest.qWait(5000) # noinspection PyArgumentList @@ -255,13 +259,13 @@ def test_execute_questionnaire(run, qtbot): assert run.Stack.count() == 1 cb_cnt = 1 for child in run.Stack.currentWidget().children(): - if type(child) == QCheckBox: - for i in range(cb_cnt): + if isinstance(child, QCheckBox): + for _ in range(cb_cnt): child.click() cb_cnt += 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_cb.csv', mode='r') as file: @@ -270,13 +274,14 @@ def test_execute_questionnaire(run, qtbot): for lines in csv_file: results = lines assert len(results) == 6 - assert lines[0] == '1' # participant number - assert lines[1] == 'True' # first box checked - assert lines[2] == 'False' # second box not checked - assert lines[3] == 'True' # third box checked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'True' # first box checked + assert results[2] == 'False' # second box not checked + assert results[3] == 'True' # third box checked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove("./test/results/results_cb.csv") + QTest.qWait(5000) # noinspection PyArgumentList @@ -285,16 +290,16 @@ def test_execute_questionnaire_blocked(run, qtbot): assert run.Stack.count() == 1 cb_cnt = 1 for child in run.Stack.currentWidget().children(): - if type(child) == QCheckBox: - for i in range(cb_cnt): + if isinstance(child, QCheckBox): + for _ in range(cb_cnt): child.click() cb_cnt += 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -302,17 +307,18 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'cb1_0' - assert lines[2] == 'cb1_1' - assert lines[3] == 'cb1_2' - assert lines[4] == 'Start' - assert lines[5] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'cb1_0' + assert results[2] == 'cb1_1' + assert results[3] == 'cb1_2' + assert results[4] == 'Start' + assert results[5] == 'End' assert len(results) == 6 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == 'True' # first cb checked - assert lines[2] == 'False' # second cb not checked - assert lines[3] == 'True' # third cb checked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == 'True' # first cb checked + assert results[2] == 'False' # second cb not checked + assert results[3] == 'True' # third cb checked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove(res_file) + QTest.qWait(5000) diff --git a/test/Image_test.py b/test/Image_test.py index 3294c3d93db9a3d8720111c395f6558639adb3ab..ecd509ea2bb5dbee4c5d21c07fd1a28ad1097f5c 100644 --- a/test/Image_test.py +++ b/test/Image_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of Image.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, QHBoxLayout, keyboard, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, Image @pytest.fixture @@ -27,19 +27,19 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -52,42 +52,42 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Image" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Image"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Image"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit' else fields_per_type["Image"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Image"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Image"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit' else fields_per_type["Image"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1)) == QHBoxLayout and \ - gui_init.gui.img_layout == layout.itemAt(row, 1): + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout) and \ + gui_init.gui.img_layout == layout.itemAt(row, QFormLayout.ItemRole.FieldRole): not_none_rows += 1 - assert layout.itemAt(row, 1).itemAt(1).widget().text() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().text() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["Image"][0].keys()) assert len(gui_init.undo_stack) == 14 # 2 for creating page & question, 12 for choosing Image @@ -102,7 +102,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Image"} for key, value in default_values.items(): - if key in fields_per_type["Image"][0].keys(): + if key in fields_per_type["Image"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -133,8 +133,8 @@ def test_create(gui_init, qtbot): def test_file(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(1)) # should be 'Image' @@ -142,9 +142,9 @@ def test_file(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Image" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) img_str = find_row_by_label(gui_load.gui.edit_layout, 'image_file') - imgfile = gui_load.gui.edit_layout.itemAt(img_str[0], 1).itemAt(img_str[1]).widget().text() + imgfile = gui_load.gui.edit_layout.itemAt(img_str[0], QFormLayout.ItemRole.FieldRole).itemAt(img_str[1]).widget().text() assert imgfile == './src/Configs/Logo.png' def handle_file_chooser(): @@ -152,11 +152,11 @@ def test_file(gui_load, qtbot): keyboard.write("Logo.png") keyboard.press("enter") - img_btn = gui_load.gui.edit_layout.itemAt(find_row_by_label(gui_load.gui.edit_layout, 'image_file_btn')[0], 1).itemAt(0).widget() + img_btn = gui_load.gui.edit_layout.itemAt(find_row_by_label(gui_load.gui.edit_layout, 'image_file_btn')[0], QFormLayout.ItemRole.FieldRole).itemAt(0).widget() QTimer.singleShot(100, handle_file_chooser) QTest.mouseClick(img_btn, Qt.MouseButton.LeftButton) - imgfile = gui_load.gui.edit_layout.itemAt(img_str[0], 1).itemAt(img_str[1]).widget().text() + imgfile = gui_load.gui.edit_layout.itemAt(img_str[0], QFormLayout.ItemRole.FieldRole).itemAt(img_str[1]).widget().text() assert imgfile.endswith("Logo.png") QTimer.singleShot(150, handle_dialog_no_save) @@ -167,8 +167,8 @@ def test_file(gui_load, qtbot): def test_scale(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(1)) # should be 'Image' @@ -176,111 +176,113 @@ def test_scale(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Image" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) width_pos = find_row_by_label(gui_load.gui.edit_layout, 'width') height_pos = find_row_by_label(gui_load.gui.edit_layout, 'height') - gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().insert("99") - assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "99" - gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99") + assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" + gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["width"] == "99" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "99" + assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" assert gui_load.structure["Page 1"]["Image"]["width"] == "99" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().insert("99") - assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "99" - gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().editingFinished.emit() + assert not error_found + assert not warning_found + gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99") + assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" + gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["height"] == "99" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "99" + assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" assert gui_load.structure["Page 1"]["Image"]["height"] == "99" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/imgtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Image: + if isinstance(child, Image): assert child.width() == 99 assert child.height() == 99 test_gui.close() # -------- -1 --------- - gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().insert("-1") - assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "-1" - gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1") + assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" + gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["width"] == "-1" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "-1" + assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" assert gui_load.structure["Page 1"]["Image"]["width"] == "-1" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False - gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().insert("-1") - assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "-1" - gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().editingFinished.emit() + assert error_found + assert not warning_found + gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1") + assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" + gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["height"] == "-1" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "-1" + assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" assert gui_load.structure["Page 1"]["Image"]["height"] == "-1" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # ---------0-------- - gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().insert("0") - assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "0" - gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0") + assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["width"] == "0" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "0" + assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" assert gui_load.structure["Page 1"]["Image"]["width"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False - gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().insert("0") - assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "0" - gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().editingFinished.emit() + assert error_found + assert not warning_found + gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0") + assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["height"] == "0" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "0" + assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" assert gui_load.structure["Page 1"]["Image"]["height"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found gui_load.structure["Page 1"]["Image"]["height"] = 100 gui_load.structure["Page 1"]["Image"]["width"] = 250 - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) gui_load.close() os.remove("./test/results/results_img.csv") @@ -289,8 +291,8 @@ def test_scale(gui_load, qtbot): def test_move(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(1)) # should be 'Image' @@ -298,109 +300,111 @@ def test_move(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Image" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x_pos') y_pos = find_row_by_label(gui_load.gui.edit_layout, 'y_pos') - gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().clear() - gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().insert("99") - assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "99" - gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().clear() + gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().insert("99") + assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "99" + gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "99" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "99" + assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "99" assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "99" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().clear() - gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().insert("99") - assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "99" - gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().editingFinished.emit() + assert not error_found + assert not warning_found + gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().clear() + gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().insert("99") + assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "99" + gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "99" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "99" + assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "99" assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "99" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/imgtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Image: + if isinstance(child, Image): assert child.x() == 99 assert child.y() == 99 test_gui.close() # -------- -1 --------- - gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().clear() - gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().insert("-1") - assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "-1" - gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().clear() + gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().insert("-1") + assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "-1" + gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "-1" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "-1" + assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "-1" assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "-1" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False - gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().clear() - gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().insert("-1") - assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "-1" - gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().editingFinished.emit() + assert error_found + assert not warning_found + gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().clear() + gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().insert("-1") + assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "-1" + gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "-1" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "-1" + assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "-1" assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "-1" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # ---------0-------- - gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().clear() - gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().insert("0") - assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "0" - gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().clear() + gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().insert("0") + assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "0" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "0" + assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "0" assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False - gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().clear() - gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().insert("0") - assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "0" - gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().editingFinished.emit() + assert error_found + assert not warning_found + gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().clear() + gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().insert("0") + assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "0" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "0" + assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "0" assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.structure["Page 1"]["Image"]["x_pos"] = 1800 gui_load.structure["Page 1"]["Image"]["y_pos"] = 400 - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) gui_load.close() os.remove("./test/results/results_img.csv") @@ -409,8 +413,8 @@ def test_move(gui_load, qtbot): def test_image_position(gui_load, qtbot, capfd): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(1)) # should be 'Image' @@ -418,126 +422,125 @@ def test_image_position(gui_load, qtbot, capfd): assert tv.selectedItems()[0].text(0) == "Image" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) # --- free --- pos_pos = find_row_by_label(gui_load.gui.edit_layout, 'image_position') - pos_cb = gui_load.gui.edit_layout.itemAt(pos_pos, 1).widget() + pos_cb = gui_load.gui.edit_layout.itemAt(pos_pos, QFormLayout.ItemRole.FieldRole).widget() assert pos_cb.currentText() == 'free' - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/imgtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Image: + if isinstance(child, Image): assert child.x() == 1800 assert child.y() == 400 test_gui.close() # --- right --- - QTest.mouseClick(pos_cb, Qt.LeftButton) - QTest.keyClick(pos_cb, Qt.Key_Up) - QTest.keyClick(pos_cb, Qt.Key_Enter) + QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(pos_cb, Qt.Key.Key_Up) + QTest.keyClick(pos_cb, Qt.Key.Key_Enter) assert pos_cb.currentText() == "right" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Image"]["image_position"] == "right" gui_load.save() test_gui = StackedWindowGui("./test/imgtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Image: - assert type(child.parent().layout()) == QHBoxLayout - print(child.parent().children()) + if isinstance(child, Image): + assert isinstance(child.parent().layout(), QHBoxLayout) assert child.parent().layout().indexOf(child) == 1 test_gui.close() # --- left --- - QTest.mouseClick(pos_cb, Qt.LeftButton) - QTest.keyClick(pos_cb, Qt.Key_Up) - QTest.keyClick(pos_cb, Qt.Key_Enter) + QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(pos_cb, Qt.Key.Key_Up) + QTest.keyClick(pos_cb, Qt.Key.Key_Enter) assert pos_cb.currentText() == "left" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Image"]["image_position"] == "left" gui_load.save() test_gui = StackedWindowGui("./test/imgtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Image: - assert type(child.parent().layout()) == QHBoxLayout + if isinstance(child, Image): + assert isinstance(child.parent().layout(), QHBoxLayout) assert child.parent().layout().indexOf(child) == 0 test_gui.close() # --- bottom --- - QTest.mouseClick(pos_cb, Qt.LeftButton) - QTest.keyClick(pos_cb, Qt.Key_Up) - QTest.keyClick(pos_cb, Qt.Key_Enter) + QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(pos_cb, Qt.Key.Key_Up) + QTest.keyClick(pos_cb, Qt.Key.Key_Enter) assert pos_cb.currentText() == "bottom" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Image"]["image_position"] == "bottom" gui_load.save() test_gui = StackedWindowGui("./test/imgtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Image: - assert type(child.parent().layout()) == QFormLayout + if isinstance(child, Image): + assert isinstance(child.parent().layout(), QFormLayout) assert child.parent().layout().getWidgetPosition(child)[0] == len(gui_load.structure["Page 1"].sections) - 1 # --- top --- - QTest.mouseClick(pos_cb, Qt.LeftButton) - QTest.keyClick(pos_cb, Qt.Key_Up) - QTest.keyClick(pos_cb, Qt.Key_Enter) + QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(pos_cb, Qt.Key.Key_Up) + QTest.keyClick(pos_cb, Qt.Key.Key_Enter) assert pos_cb.currentText() == "top" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Image"]["image_position"] == "top" gui_load.save() test_gui = StackedWindowGui("./test/imgtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Image: - assert type(child.parent().layout()) == QFormLayout + if isinstance(child, Image): + assert isinstance(child.parent().layout(), QFormLayout) assert child.parent().layout().getWidgetPosition(child)[0] == 0 test_gui.close() # --- here --- - QTest.mouseClick(pos_cb, Qt.LeftButton) - QTest.keyClick(pos_cb, Qt.Key_Up) - QTest.keyClick(pos_cb, Qt.Key_Enter) + QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(pos_cb, Qt.Key.Key_Up) + QTest.keyClick(pos_cb, Qt.Key.Key_Enter) assert pos_cb.currentText() == "here" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Image"]["image_position"] == "here" gui_load.save() test_gui = StackedWindowGui("./test/imgtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == Image: - assert type(child.parent().layout()) == QFormLayout + if isinstance(child, Image): + assert isinstance(child.parent().layout(), QFormLayout) assert child.parent().layout().getWidgetPosition(child)[0] == gui_load.structure["Page 1"].sections.index("Image") test_gui.close() - QTest.mouseClick(pos_cb, Qt.LeftButton) - QTest.keyClick(pos_cb, Qt.Key_Down) - QTest.keyClick(pos_cb, Qt.Key_Down) - QTest.keyClick(pos_cb, Qt.Key_Down) - QTest.keyClick(pos_cb, Qt.Key_Down) - QTest.keyClick(pos_cb, Qt.Key_Down) - QTest.keyClick(pos_cb, Qt.Key_Enter) + QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(pos_cb, Qt.Key.Key_Down) + QTest.keyClick(pos_cb, Qt.Key.Key_Down) + QTest.keyClick(pos_cb, Qt.Key.Key_Down) + QTest.keyClick(pos_cb, Qt.Key.Key_Down) + QTest.keyClick(pos_cb, Qt.Key.Key_Down) + QTest.keyClick(pos_cb, Qt.Key.Key_Enter) assert pos_cb.currentText() == 'free' gui_load.structure["Page 1"]["Image"]["x_pos"] = 1800 gui_load.structure["Page 1"]["Image"]["y_pos"] = 400 - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.save() os.remove("./test/results/results_img.csv") gui_load.close() @@ -547,13 +550,13 @@ def test_image_position(gui_load, qtbot, capfd): def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == Image: + if isinstance(child, Image): assert child.width() == 250 assert child.height() == 100 assert child.x() == 1800 assert child.y() == 400 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_img.csv', mode='r') as file: @@ -562,13 +565,13 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'Start' - assert lines[2] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'Start' + assert results[2] == 'End' assert len(results) == 3 - assert lines[0] == '1' # participant number - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp os.remove("./test/results/results_img.csv") @@ -577,11 +580,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_img.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -589,11 +592,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'Start' - assert lines[2] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'Start' + assert results[2] == 'End' assert len(results) == 3 - assert lines[0] == '-1' # participant number unknown - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp + assert results[0] == '-1' # participant number unknown + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp os.remove(res_file) diff --git a/test/MockReceiver.py b/test/MockReceiver.py index ec304e65d4e919c2a2ff8393768a34d5cef6f176..059452a1ecbd13ec1961ca60f05290eb889c5618 100644 --- a/test/MockReceiver.py +++ b/test/MockReceiver.py @@ -33,6 +33,7 @@ class MockReceiver(Thread): def message_handler(self, addr, args): """Handle the received OSC messages""" + # print("message received....",addr, args) if addr == "/play": self.message_stack.append(("/stop", 0.0)) self.message_stack.append((addr, 1.0)) @@ -59,6 +60,7 @@ class MockReceiver(Thread): self.message_stack.append(("/track/4/mute", 1.0)) else: self.message_stack.append((addr, args)) + # print("Message stack afterwards.....", self.message_stack) def start_server(self, port): """Start OSC listener.""" @@ -69,5 +71,5 @@ class MockReceiver(Thread): self.server = osc_server.ThreadingOSCUDPServer(('127.0.0.1', port), dispat) except Exception as e: print(e) - print("Serving on {}".format(self.server.server_address)) + print(f'Serving on {self.server.server_address}') self.server.serve_forever() diff --git a/test/Mushra_test.py b/test/Mushra_test.py index ec067ba5ee38b785634addbb1431c93ff36f719f..b98cf3eda6bbfd3701ca4c80531ee28c7b9e8ccf 100644 --- a/test/Mushra_test.py +++ b/test/Mushra_test.py @@ -1,7 +1,7 @@ """Testing the behaviour of MUSHRA.py + QEditGui.py""" - -from context import * -thread = None +import time +from context import pytest, MUSHRA, QPoint, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, handle_dialog, csv, re, os, mock_file, MockReceiver, QHBoxLayout +THREAD = None @pytest.fixture @@ -21,25 +21,25 @@ def gui_load(gui_init): def prepare_listeners(structure): """Set up the listeners for Reaper""" - global thread + global THREAD print("setting up thread....") - thread = MockReceiver(int(structure["audio_port"])) + THREAD = MockReceiver(int(structure["audio_port"])) QTest.qWait(1000) - thread.start() + THREAD.start() QTest.qWait(3000) @pytest.fixture def run(): """Execute the questionnaire.""" - global thread + global THREAD structure = ConfigObj("./test/osctest.txt") port = int(structure["Page 1"]["Question 1"]["receiver"][1]) print("setting up thread....") # if thread is None or (thread is not None and thread.port != port): - thread = MockReceiver(port) + THREAD = MockReceiver(port) QTest.qWait(1000) - thread.start() + THREAD.start() QTest.qWait(1000) # elif thread is not None and not thread.is_alive(): # thread.start() @@ -64,29 +64,29 @@ def find_row_by_label(layout, label): row of the field """ for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem and layout.itemAt(row, 0).widget().text() == label: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label: return row - elif type(layout.itemAt(row, 1)) == QHBoxLayout: - if layout.itemAt(row, 0).widget().text() == label: + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout): + if layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label: return row # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(200, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(200, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -99,36 +99,36 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "MUSHRA" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["MUSHRA"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["MUSHRA"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["MUSHRA"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["MUSHRA"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["MUSHRA"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["MUSHRA"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1)) == QHBoxLayout: + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout): not_none_rows += 1 - for cbs in range(layout.itemAt(row, 1).count()): - assert layout.itemAt(row, 1).itemAt(cbs).widget().isChecked() == True + for cbs in range(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count()): + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(cbs).widget().isChecked() assert not_none_rows == len(fields_per_type["MUSHRA"][0].keys()) assert len(gui_init.undo_stack) == 8 # 2 for creating page & question, 6 for choosing MUSHRA @@ -144,7 +144,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "MUSHRA"} for key, value in default_values.items(): - if key in fields_per_type["MUSHRA"][0].keys(): + if key in fields_per_type["MUSHRA"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -174,8 +174,8 @@ def test_create(gui_init, qtbot): def test_start_cues(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -183,51 +183,52 @@ def test_start_cues(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) sc_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_cues') # try to set it as string - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("one") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "one" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "one" QTimer.singleShot(200, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(200, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "one" + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one" assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "one" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # set it as list shorter than end_cues - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1,2") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1,2" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1,2" QTimer.singleShot(200, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(200, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1,2" + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2" assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == (1, 2) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True # len(start_cues)==2, len(end_cues)==3 - assert warning_found == False - QTimer.singleShot(150, handle_dialog_no_save) + assert error_found # len(start_cues)==2, len(end_cues)==3 + assert not warning_found + gui_load.structure["Page 1"]["Question 1"]["start_cues"] = [1, 2, 3] + gui_load.save() gui_load.close() def test_end_cues(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -235,7 +236,7 @@ def test_end_cues(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) # try to set it as string gui_load.structure["Page 1"]["Question 1"]["end_cues"] = "one" @@ -246,8 +247,8 @@ def test_end_cues(gui_load, qtbot): assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == "one" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # try to set it as list shorter than start_cues gui_load.structure["Page 1"]["Question 1"]["end_cues"] = "1,2" @@ -258,15 +259,15 @@ def test_end_cues(gui_load, qtbot): assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == (1, 2) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # try to set it same as start_cues end_pos = find_row_by_label(gui_load.gui.edit_layout, 'end_cues') - gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().setText("5, 2, 6") - assert gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().text() == "5, 2, 6" - gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().setText("5, 2, 6") + assert gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "5, 2, 6" + gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() gui_load.structure["Page 1"]["Question 1"]["end_cues"] = "5, 2, 6" QTimer.singleShot(200, handle_dialog_error) gui_load.gui.load_preview() @@ -275,17 +276,19 @@ def test_end_cues(gui_load, qtbot): assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == (5, 2, 6) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False - QTimer.singleShot(150, handle_dialog_no_save) + assert error_found + assert not warning_found + + gui_load.structure["Page 1"]["Question 1"]["end_cues"] = (4, 5, 6) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.close() def test_track(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -293,88 +296,90 @@ def test_track(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) track_pos = find_row_by_label(gui_load.gui.edit_layout, 'track') # try to set it as string - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("one") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "one" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "one" QTimer.singleShot(200, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(200, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "one" + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one" assert gui_load.structure["Page 1"]["Question 1"]["track"] == "one" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # set it as list (shouldn't work as audio_tracks = 4 by default) - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,2,3,4,5") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,2,3,4,5" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2,3,4,5") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3,4,5" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,2,3,4,5" QTimer.singleShot(200, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(200, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,2,3,4,5" + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3,4,5" assert gui_load.structure["Page 1"]["Question 1"]["track"] == [1, 2, 3, 4, 5] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # but it works when audio_tracks is >= max(track) - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,2,3") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,2,3" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2,3") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,2,3" QTimer.singleShot(200, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(200, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,2,3" + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3" assert gui_load.structure["Page 1"]["Question 1"]["track"] == [1, 2, 3] error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found # only one -> all the same track - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1" + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" assert gui_load.structure["Page 1"]["Question 1"]["track"] == '1' error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found # len(start/end_cues)>len(track)>1 -> error - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,1") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,1" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,1") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,1" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,1" + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1" assert gui_load.structure["Page 1"]["Question 1"]["track"] == [1, 1] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False - QTimer.singleShot(150, handle_dialog_no_save) + assert error_found + assert not warning_found + + gui_load.structure["Page 1"]["Question 1"]["track"] = [1, 1, 1] + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.close() @@ -385,8 +390,8 @@ def test_xfade(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -394,133 +399,130 @@ def test_xfade(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center(), delay=1) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center(), delay=1000) x_pos = find_row_by_label(gui_load.gui.edit_layout, 'xfade') start_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_cues') end_pos = find_row_by_label(gui_load.gui.edit_layout, 'end_cues') track_pos = find_row_by_label(gui_load.gui.edit_layout, 'track') # set xfade to true - assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == False - gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True - assert gui_load.structure["Page 1"]["Question 1"]["xfade"] == True + assert not gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load.structure["Page 1"]["Question 1"]["xfade"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True # start and end need to be the same for all cues - assert warning_found == False - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().setText("1,1,1") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "1,1,1" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() + assert error_found # start and end need to be the same for all cues + assert not warning_found + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,1,1") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1,1" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1,1,1" - gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().setText("2,2,2") - assert gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().text() == "2,2,2" - gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().setText("2,2,2") + assert gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2,2,2" + gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == "2,2,2" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True # need to change tracks from all 1 - assert warning_found == False - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,1,2") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,1,2" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + assert error_found # need to change tracks from all 1 + assert not warning_found + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,1,2") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1,2" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,1,2" gui_load.gui.refresh_button.click() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=1) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/mrtest.txt")) test_gui = StackedWindowGui("./test/mrtest.txt") assert test_gui.Stack.count() == 1 - assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command) + time.sleep(1) + assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command) for child in test_gui.Stack.currentWidget().children(): - if type(child) == MUSHRA: - assert child.loop_button.isEnabled() == True - assert child.loop_button.isChecked() == False - assert child.xfade.isEnabled() == True - assert child.xfade.isChecked() == False - assert child.pause_button.isEnabled() == False - assert child.stop_button.isEnabled() == False + if isinstance(child, MUSHRA): + assert child.loop_button.isEnabled() + assert not child.loop_button.isChecked() + assert child.xfade.isEnabled() + assert not child.xfade.isChecked() + assert not child.pause_button.isEnabled() + assert not child.stop_button.isEnabled() child.refbutton.click() - QTest.qWait(2000) - print(thread.message_stack) - assert thread.message_stack[-6] == ('/track/1/mute', 0.0) - assert thread.message_stack[-3] == ("/action", 40161) - assert thread.message_stack[-1] == ("/play", 1.0) - assert thread.message_stack[-2] == ("/stop", 0.0) - assert child.loop_button.isEnabled() == False - assert child.loop_button.isChecked() == False + time.sleep(5) + assert THREAD.message_stack[-6] == ('/track/1/mute', 0.0) + assert THREAD.message_stack[-3] == ("/action", 40161) + assert THREAD.message_stack[-1] == ("/play", 1.0) + assert THREAD.message_stack[-2] == ("/stop", 0.0) + assert not child.loop_button.isEnabled() + assert not child.loop_button.isChecked() child.stop_button.click() - QTest.qWait(2000) - assert thread.message_stack[-1] == ("/play", 0.0) - assert thread.message_stack[-2] == ("/stop", 1.0) - assert child.loop_button.isEnabled() == True - assert child.loop_button.isChecked() == False + time.sleep(5) + assert THREAD.message_stack[-1] == ("/play", 0.0) + assert THREAD.message_stack[-2] == ("/stop", 1.0) + assert child.loop_button.isEnabled() + assert not child.loop_button.isChecked() child.loop_button.click() - QTest.qWait(2000) - assert thread.message_stack[-1] == ('/action', '_RSa8eee394f75b27ef6bb9f0e15b6bee26d9363990') - assert child.loop_button.isEnabled() == True - assert child.loop_button.isChecked() == True - for sl in range(len(child.buttons)): - child.buttons[sl].click() # starts each stimulus - assert child.loop_button.isEnabled() == False - assert child.loop_button.isChecked() == True - QTest.qWait(2000) - print(thread.message_stack) - assert thread.message_stack[-9] == ('/track/{}/mute'.format(sl+1), 0.0) - assert thread.message_stack[-6] == ("/action", 40162) - assert thread.message_stack[-5] == ("/action", 40223) - assert thread.message_stack[-4] == ("/action", 40161) - assert thread.message_stack[-3] == ("/action", 40222) - assert thread.message_stack[-1] == ("/play", 1.0) - assert thread.message_stack[-2] == ("/stop", 0.0) + time.sleep(5) + assert THREAD.message_stack[-1] == ('/action', MUSHRA.loop_on_command) + assert child.loop_button.isEnabled() + assert child.loop_button.isChecked() + for sl, btn in enumerate(child.buttons): + btn.click() # starts each stimulus + assert not child.loop_button.isEnabled() + assert child.loop_button.isChecked() + time.sleep(5) + assert THREAD.message_stack[-9] == (f'/track/{sl + 1}/mute', 0.0) + assert THREAD.message_stack[-6] == ("/action", 40162) + assert THREAD.message_stack[-5] == ("/action", 40223) + assert THREAD.message_stack[-4] == ("/action", 40161) + assert THREAD.message_stack[-3] == ("/action", 40222) + assert THREAD.message_stack[-1] == ("/play", 1.0) + assert THREAD.message_stack[-2] == ("/stop", 0.0) bb = child.sliders[sl].rect() - QTest.mouseClick(child.sliders[sl], Qt.LeftButton, pos=QPoint(bb.center().x(), int( - bb.bottom() - 0.1 * (sl + 1) * bb.bottom()))) + QTest.mouseClick(child.sliders[sl], Qt.MouseButton.LeftButton, pos=QPoint(bb.center().x(), int(bb.bottom() - 0.1 * (sl + 1) * bb.bottom()))) child.stop_button.click() - assert child.loop_button.isEnabled() == True - assert child.loop_button.isChecked() == True + assert child.loop_button.isEnabled() + assert child.loop_button.isChecked() child.loop_button.click() - assert child.loop_button.isEnabled() == True - assert child.loop_button.isChecked() == False - print(thread.message_stack) + assert child.loop_button.isEnabled() + assert not child.loop_button.isChecked() test_gui.close() - thread.stop(0.1) + THREAD.stop(0.1) QTest.qWait(1000) # reset file - assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True - gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == False - assert gui_load.structure["Page 1"]["Question 1"]["xfade"] == False - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().setText("1,2,3") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "1,2,3" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert not gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert not gui_load.structure["Page 1"]["Question 1"]["xfade"] + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2,3") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1,2,3" - gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().setText("4,5,6") - assert gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().text() == "4,5,6" - gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().setText("4,5,6") + assert gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "4,5,6" + gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == "4,5,6" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,1,1") - assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,1,1" - gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,1,1") + assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1,1" + gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,1,1" gui_load.gui.refresh_button.click() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=1) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) os.remove("./test/results/results_mr.csv") gui_load.close() @@ -529,10 +531,10 @@ def test_xfade(gui_load, qtbot): # noinspection PyArgumentList def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 - assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command) + assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command) QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_mr.csv', mode='r') as file: @@ -541,21 +543,21 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'mr' - assert lines[2] == 'mr_1' - assert lines[3] == 'mr_2' - assert lines[4] == 'Start' - assert lines[5] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'mr' + assert results[2] == 'mr_1' + assert results[3] == 'mr_2' + assert results[4] == 'Start' + assert results[5] == 'End' assert len(results) == 6 - assert lines[0] == '1' # participant number - assert lines[1] == '[[], [], []]' # no stimulus played yet - assert lines[2] == '100' # default slider value - assert lines[3] == '100' # default slider value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '[[], [], []]' # no stimulus played yet + assert results[2] == '100' # default slider value + assert results[3] == '100' # default slider value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove("./test/results/results_mr.csv") - thread.stop(0.1) + THREAD.stop(0.1) QTest.qWait(1000) @@ -563,13 +565,13 @@ def test_execute_questionnaire_no_interaction(run, qtbot): def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_mr.csv'): assert run.Stack.count() == 1 - assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command) + assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -577,21 +579,21 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'mr' - assert lines[2] == 'mr_1' - assert lines[3] == 'mr_2' - assert lines[4] == 'Start' - assert lines[5] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'mr' + assert results[2] == 'mr_1' + assert results[3] == 'mr_2' + assert results[4] == 'Start' + assert results[5] == 'End' assert len(results) == 6 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '[[], [], []]' # no stimulus played yet - assert lines[2] == '100' # default slider value - assert lines[3] == '100' # default slider value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '[[], [], []]' # no stimulus played yet + assert results[2] == '100' # default slider value + assert results[3] == '100' # default slider value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove(res_file) - thread.stop(0.1) + THREAD.stop(0.1) QTest.qWait(1000) @@ -600,23 +602,23 @@ def test_execute_questionnaire(run, qtbot): if os.path.exists("./test/results/results_mr.csv"): os.remove("./test/results/results_mr.csv") assert run.Stack.count() == 1 - assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command) + assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command) for child in run.Stack.currentWidget().children(): - if type(child) == MUSHRA: - assert child.conditionsUseSameMarker == False - assert hasattr(child, 'xfade') == False - assert child.playing == False + if isinstance(child, MUSHRA): + assert not child.conditionsUseSameMarker + assert not hasattr(child, 'xfade') + assert not child.playing child.refbutton.click() for sl in range(len(child.buttons)): - assert child.sliders[sl].isEnabled() == False - for sl in range(len(child.buttons)): - child.buttons[sl].click() # starts each stimulus + assert not child.sliders[sl].isEnabled() + for sl, btn in enumerate(child.buttons): + btn.click() # starts each stimulus QTest.qWait(500) bb = child.sliders[sl].rect() - QTest.mouseClick(child.sliders[sl], Qt.LeftButton, pos=QPoint(bb.center().x(), int(bb.bottom()-0.1*(sl+1)*bb.bottom()))) + QTest.mouseClick(child.sliders[sl], Qt.MouseButton.LeftButton, pos=QPoint(bb.center().x(), int(bb.bottom() - 0.1 * (sl + 1) * bb.bottom()))) QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_mr.csv', mode='r') as file: @@ -625,13 +627,13 @@ def test_execute_questionnaire(run, qtbot): for lines in csv_file: results = lines assert len(results) == 6 - assert lines[0] == '1' # participant number - assert re.match(r'\[\[\d.\d+], \[\d.\d+], \[\d.\d+]]', lines[1]) # list of durations - assert int(lines[2]) < int(lines[3]) - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\[\[\d.\d+], \[\d.\d+], \[\d.\d+]]', results[1]) # list of durations + assert int(results[2]) < int(results[3]) + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove("./test/results/results_mr.csv") - thread.stop(0.1) + THREAD.stop(0.1) QTest.qWait(1000) @@ -639,27 +641,26 @@ def test_execute_questionnaire(run, qtbot): def test_execute_questionnaire_blocked(run, qtbot): with mock_file(r'./test/results/results_mr.csv'): assert run.Stack.count() == 1 - assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command) + assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command) for child in run.Stack.currentWidget().children(): - if type(child) == MUSHRA: - assert child.conditionsUseSameMarker == False - assert hasattr(child, 'xfade') == False - assert child.playing == False + if isinstance(child, MUSHRA): + assert not child.conditionsUseSameMarker + assert not hasattr(child, 'xfade') + assert not child.playing child.refbutton.click() for sl in range(len(child.buttons)): - assert child.sliders[sl].isEnabled() == False - for sl in range(len(child.buttons)): - child.buttons[sl].click() # starts each stimulus + assert not child.sliders[sl].isEnabled() + for sl, btn in enumerate(child.buttons): + btn.click() # starts each stimulus QTest.qWait(500) bb = child.sliders[sl].rect() - QTest.mouseClick(child.sliders[sl], Qt.LeftButton, - pos=QPoint(bb.center().x(), int(bb.bottom() - 0.1 * (sl + 1) * bb.bottom()))) + QTest.mouseClick(child.sliders[sl], Qt.MouseButton.LeftButton, pos=QPoint(bb.center().x(), int(bb.bottom() - 0.1 * (sl + 1) * bb.bottom()))) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -667,18 +668,18 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'mr' - assert lines[2] == 'mr_1' - assert lines[3] == 'mr_2' - assert lines[4] == 'Start' - assert lines[5] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'mr' + assert results[2] == 'mr_1' + assert results[3] == 'mr_2' + assert results[4] == 'Start' + assert results[5] == 'End' assert len(results) == 6 - assert lines[0] == '-1' # participant number unknown - assert re.match(r'\[\[\d.\d+], \[\d.\d+], \[\d.\d+]]', lines[1]) # list of durations - assert int(lines[2]) < int(lines[3]) - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '-1' # participant number unknown + assert re.match(r'\[\[\d.\d+], \[\d.\d+], \[\d.\d+]]', results[1]) # list of durations + assert int(results[2]) < int(results[3]) + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove(res_file) - thread.stop(0.1) + THREAD.stop(0.1) QTest.qWait(1000) diff --git a/test/OSCButton_test.py b/test/OSCButton_test.py index b3c26154d54f5fa255413be5773e63b7d6a468c9..b88b02b7c6ea6473563beb6a1b88a7509e3d3cc4 100644 --- a/test/OSCButton_test.py +++ b/test/OSCButton_test.py @@ -1,5 +1,5 @@ """Testing the behaviour of OSCButton.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, OSCButton, MockReceiver, handle_dialog_warning thread = None @@ -47,19 +47,19 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -72,39 +72,39 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "OSCButton" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["OSCButton"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["OSCButton"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["OSCButton"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["OSCButton"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["OSCButton"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["OSCButton"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["OSCButton"][0].keys()) assert len(gui_init.undo_stack) == 15 # 2 for creating page & question, 13 for choosing OSCButton @@ -119,7 +119,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "OSCButton"} for key, value in default_values.items(): - if key in fields_per_type["OSCButton"][0].keys(): + if key in fields_per_type["OSCButton"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -149,8 +149,8 @@ def test_create(gui_init, qtbot): def test_inscription(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -158,113 +158,113 @@ def test_inscription(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) ins_pos = find_row_by_label(gui_load.gui.edit_layout, 'inscription') # change text - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("Click me") - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Click me" - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Click me") + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Click me" + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Click me" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Click me" + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Click me" assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Click me" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners("./test/osctest.txt") test_gui = StackedWindowGui("./test/osctest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == OSCButton: + if isinstance(child, OSCButton): assert child.button.text() == "Click me" QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread.stop(0.1) QTest.qWait(1000) # empty inscription -> warning - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("") - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "" - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("") + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "" + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners("./test/osctest.txt") QTimer.singleShot(500, handle_dialog_warning) test_gui = StackedWindowGui("./test/osctest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == OSCButton: + if isinstance(child, OSCButton): assert child.button.text() == "" child.button.click() QTest.qWait(1000) QTimer.singleShot(1000, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread.stop(0.1) QTest.qWait(1000) # predefined 'None' - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("None") - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "None" - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("None") + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "None" + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "None" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "None" + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "None" assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "None" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners("./test/osctest.txt") QTimer.singleShot(150, handle_dialog_warning) test_gui = StackedWindowGui("./test/osctest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == OSCButton: + if isinstance(child, OSCButton): assert child.button.text() == "None" child.button.click() QTest.qWait(500) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread.stop(0.1) QTest.qWait(1000) # reset file - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("Send message") - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Send message" - gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Send message") + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Send message" + gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Send message" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Send message" + assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Send message" assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Send message" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) os.remove("./test/results/results_osc.csv") gui_load.close() @@ -274,8 +274,8 @@ def test_inscription(gui_load, qtbot): def test_address(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -283,68 +283,68 @@ def test_address(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) adr_pos = find_row_by_label(gui_load.gui.edit_layout, 'address') # change text to without / -> warning - gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().setText("send") - assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "send" - gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().setText("send") + assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "send" + gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["address"] == "send" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "send" + assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "send" assert gui_load.structure["Page 1"]["Question 1"]["address"] == "send" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True + assert not error_found + assert warning_found gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners("./test/osctest.txt") QTimer.singleShot(150, handle_dialog_warning) test_gui = StackedWindowGui("./test/osctest.txt") assert test_gui.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread.stop(0.1) QTest.qWait(1000) # empty address -> error - gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().setText("") - assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "" - gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().setText("") + assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" + gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["address"] == "" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "" + assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" # assert gui_load.structure["Page 1"]["Question 1"]["address"] == "" #TODO?? QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # reset file - gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().setText("/message") - assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "/message" - gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().setText("/message") + assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "/message" + gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["address"] == "/message" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "/message" + assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "/message" assert gui_load.structure["Page 1"]["Question 1"]["address"] == "/message" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) os.remove("./test/results/results_osc.csv") gui_load.close() @@ -354,8 +354,8 @@ def test_address(gui_load, qtbot): def test_value(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -363,65 +363,65 @@ def test_value(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) val_pos = find_row_by_label(gui_load.gui.edit_layout, 'value') # change text - gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().setText("send") - assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == "send" - gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().setText("send") + assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "send" + gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["value"] == "send" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == "send" + assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "send" assert gui_load.structure["Page 1"]["Question 1"]["value"] == "send" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners("./test/osctest.txt") test_gui = StackedWindowGui("./test/osctest.txt") assert test_gui.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread.stop(0.1) QTest.qWait(1000) # empty value - gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["value"] == "" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == "" + assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" # assert gui_load.structure["Page 1"]["Question 1"]["address"] == "" #TODO?? QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # reset file - gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().setText("Hello world!") - assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == "Hello world!" - gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Hello world!") + assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Hello world!" + gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["value"] == "Hello world!" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == "Hello world!" + assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Hello world!" assert gui_load.structure["Page 1"]["Question 1"]["value"] == "Hello world!" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) os.remove("./test/results/results_osc.csv") gui_load.close() @@ -431,8 +431,8 @@ def test_value(gui_load, qtbot): def test_receiver(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -440,30 +440,30 @@ def test_receiver(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) rec_pos = find_row_by_label(gui_load.gui.edit_layout, 'receiver') - rec_cb = gui_load.gui.edit_layout.itemAt(rec_pos, 1).widget().layout().itemAt(0).widget() - rec_ip = gui_load.gui.edit_layout.itemAt(rec_pos, 1).widget().layout().itemAt(1).widget().layout().itemAt(1).widget() - rec_port = gui_load.gui.edit_layout.itemAt(rec_pos, 1).widget().layout().itemAt(1).widget().layout().itemAt(3).widget() + rec_cb = gui_load.gui.edit_layout.itemAt(rec_pos, QFormLayout.ItemRole.FieldRole).widget().layout().itemAt(0).widget() + rec_ip = gui_load.gui.edit_layout.itemAt(rec_pos, QFormLayout.ItemRole.FieldRole).widget().layout().itemAt(1).widget().layout().itemAt(1).widget() + rec_port = gui_load.gui.edit_layout.itemAt(rec_pos, QFormLayout.ItemRole.FieldRole).widget().layout().itemAt(1).widget().layout().itemAt(3).widget() - QTest.mouseClick(rec_cb, Qt.LeftButton) - QTest.keyClick(rec_cb, Qt.Key_Down) - QTest.keyClick(rec_cb, Qt.Key_Enter) + QTest.mouseClick(rec_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(rec_cb, Qt.Key.Key_Down) + QTest.keyClick(rec_cb, Qt.Key.Key_Enter) assert rec_cb.currentText() == "audio" - assert rec_ip.isEnabled() == False + assert not rec_ip.isEnabled() assert rec_ip.text() == gui_load.structure["audio_ip"] - assert rec_port.isEnabled() == False + assert not rec_port.isEnabled() assert rec_port.text() == gui_load.structure["audio_port"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["receiver"] == ["127.0.0.1", "8000"] ''' - QTest.mouseClick(rec_cb, Qt.LeftButton) - QTest.keyClick(rec_cb, Qt.Key_Down) - QTest.keyClick(rec_cb, Qt.Key_Enter) + QTest.mouseClick(rec_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(rec_cb, Qt.Key.Key_Down) + QTest.keyClick(rec_cb, Qt.Key.Key_Enter) assert rec_cb.currentText() == "help" assert rec_ip.isEnabled() == False assert rec_ip.text() == gui_load.structure["help_ip"] @@ -471,32 +471,32 @@ def test_receiver(gui_load, qtbot): assert rec_port.text() == gui_load.structure["help_port"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["receiver"] == ["", ""] ''' - QTest.mouseClick(rec_cb, Qt.LeftButton) - QTest.keyClick(rec_cb, Qt.Key_Down) - QTest.keyClick(rec_cb, Qt.Key_Enter) + QTest.mouseClick(rec_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(rec_cb, Qt.Key.Key_Down) + QTest.keyClick(rec_cb, Qt.Key.Key_Enter) assert rec_cb.currentText() == "video" - assert rec_ip.isEnabled() == False + assert not rec_ip.isEnabled() assert rec_ip.text() == gui_load.structure["video_ip"] - assert rec_port.isEnabled() == False + assert not rec_port.isEnabled() assert rec_port.text() == gui_load.structure["video_port"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["receiver"] == ["127.0.0.1", "5005"] # revert file - QTest.mouseClick(rec_cb, Qt.LeftButton) - QTest.keyClick(rec_cb, Qt.Key_Up) - QTest.keyClick(rec_cb, Qt.Key_Up) - QTest.keyClick(rec_cb, Qt.Key_Up) - QTest.keyClick(rec_cb, Qt.Key_Enter) + QTest.mouseClick(rec_cb, Qt.MouseButton.LeftButton) + QTest.keyClick(rec_cb, Qt.Key.Key_Up) + QTest.keyClick(rec_cb, Qt.Key.Key_Up) + QTest.keyClick(rec_cb, Qt.Key.Key_Up) + QTest.keyClick(rec_cb, Qt.Key.Key_Enter) assert rec_cb.currentText() == "<new>" assert rec_ip.isEnabled() assert rec_ip.text() == "" @@ -509,8 +509,8 @@ def test_receiver(gui_load, qtbot): assert gui_load.structure["Page 1"]["Question 1"]["receiver"] == ["127.0.0.1", ""] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found rec_port.clear() rec_port.setText("8000") assert rec_port.text() == "8000" @@ -529,7 +529,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_osc.csv', mode='r') as file: @@ -538,15 +538,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'osc' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'osc' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == 'False' # button not clicked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'False' # button not clicked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_osc.csv") assert thread.message_stack[-1] != ("/message", "Hello world!") thread.stop(0.1) @@ -558,11 +558,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_osc.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -570,18 +570,17 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'osc' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'osc' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == 'False' # button not clicked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == 'False' # button not clicked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) assert thread.message_stack[-1] != ("/message", "Hello world!") - print(thread.message_stack) thread.stop(0.1) QTest.qWait(1000) @@ -592,11 +591,11 @@ def test_execute_questionnaire(run, qtbot): os.remove("./test/results/results_osc.csv") assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) is OSCButton: + if isinstance(child, OSCButton): child.button.click() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_osc.csv', mode='r') as file: @@ -605,18 +604,17 @@ def test_execute_questionnaire(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'osc' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'osc' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == 'True' # button was clicked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'True' # button was clicked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_osc.csv") assert thread.message_stack[-1] == ("/message", "Hello world!") - print(thread.message_stack) thread.stop(0.1) QTest.qWait(1000) @@ -626,15 +624,15 @@ def test_execute_questionnaire_blocked(run, qtbot): with mock_file(r'./test/results/results_osc.csv'): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) is OSCButton: + if isinstance(child, OSCButton): child.button.click() QTest.qWait(3000) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -642,17 +640,16 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'osc' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'osc' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == 'True' # button not clicked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == 'True' # button not clicked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) - print(thread.message_stack) assert thread.message_stack[-1] == ('/message', 'Hello world!') thread.stop(0.1) QTest.qWait(1000) diff --git a/test/Player_test.py b/test/Player_test.py index 75647b7e5306006a2b5a66b4516ebb9655b8f1a8..b5360138a6fb22b627f6844231bb57545803c8b3 100644 --- a/test/Player_test.py +++ b/test/Player_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of Player.py + QEditGui.py""" - -from context import * +import time +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, handle_dialog, csv, re, os, mock_file, Player, QHBoxLayout, MockReceiver, player_buttons, handle_dialog_warning, open_pupil thread_audio = None thread_video = None @@ -67,29 +67,29 @@ def find_row_by_label(layout, label): row of the field """ for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem and layout.itemAt(row, 0).widget().text() == label: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label: return row - elif type(layout.itemAt(row, 1)) == QHBoxLayout: - if layout.itemAt(row, 0).widget().text() == label: + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout): + if layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label: return row # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(200, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) # .setSelected(True) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(200, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -102,35 +102,35 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Player" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Player"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Player"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["Player"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Player"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Player"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["Player"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1)) == QHBoxLayout: + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout): not_none_rows += 1 - for cbs in range(layout.itemAt(row, 1).count()): - assert layout.itemAt(row, 1).itemAt(cbs).widget().isChecked() == True + for cbs in range(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count()): + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(cbs).widget().isChecked() assert not_none_rows == len(fields_per_type["Player"][0].keys()) assert len(gui_init.undo_stack) == 7 # 2 for creating page & question, 5 for choosing Player @@ -146,7 +146,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Player"} for key, value in default_values.items(): - if key in fields_per_type["Player"][0].keys(): + if key in fields_per_type["Player"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -176,8 +176,8 @@ def test_create(gui_init, qtbot): def test_start_cue(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -185,51 +185,52 @@ def test_start_cue(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) sc_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_cue') # try to set it as string - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("one") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "one" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cue"] == "one" QTimer.singleShot(200, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(200, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "one" + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one" assert gui_load.structure["Page 1"]["Question 1"]["start_cue"] == "one" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # try to set it as list - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1,2") - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1,2" - gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2") + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2" + gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_cue"] == "1,2" QTimer.singleShot(200, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(200, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1,2" + assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2" assert gui_load.structure["Page 1"]["Question 1"]["start_cue"] == "1,2" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False - QTimer.singleShot(150, handle_dialog_no_save) + assert error_found + assert not warning_found + gui_load.structure["Page 1"]["Question 1"]["start_cue"] = "1" + gui_load.save() gui_load.close() def test_end_cue(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -237,7 +238,7 @@ def test_end_cue(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) # try to set it as string gui_load.structure["Page 1"]["Question 1"]["end_cue"] = "one" @@ -248,8 +249,8 @@ def test_end_cue(gui_load, qtbot): assert gui_load.structure["Page 1"]["Question 1"]["end_cue"] == "one" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # try to set it as list gui_load.structure["Page 1"]["Question 1"]["end_cue"] = "1,2" @@ -260,8 +261,8 @@ def test_end_cue(gui_load, qtbot): assert gui_load.structure["Page 1"]["Question 1"]["end_cue"] == "1,2" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # try to set it same as start_cue gui_load.structure["Page 1"]["Question 1"]["end_cue"] = "1" @@ -272,8 +273,8 @@ def test_end_cue(gui_load, qtbot): assert gui_load.structure["Page 1"]["Question 1"]["end_cue"] == "1" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # set value gui_load.structure["Page 1"]["Question 1"]["end_cue"] = "2" @@ -283,8 +284,10 @@ def test_end_cue(gui_load, qtbot): assert gui_load.structure["Page 1"]["Question 1"]["end_cue"] == "2" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found + gui_load.structure["Page 1"]["Question 1"]["end_cue"] = "" + gui_load.save() gui_load.close() @@ -295,8 +298,8 @@ def test_play_once(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -304,115 +307,115 @@ def test_play_once(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center(), delay=1) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center(), delay=1000) po_pos = find_row_by_label(gui_load.gui.edit_layout, 'play_once') # set play_once to true - assert gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().isChecked() == False - gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().isChecked() == True - assert gui_load.structure["Page 1"]["Question 1"]["play_once"] == True + assert not gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load.structure["Page 1"]["Question 1"]["play_once"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=1) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest.txt")) test_gui = StackedWindowGui("./test/pltest.txt") assert test_gui.Stack.count() == 1 + time.sleep(5) assert thread_audio.message_stack[-1] == ("/action", 40297) for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: - assert child.play_button.isEnabled() == True - assert child.pause_button.isEnabled() == False - assert child.stop_button.isEnabled() == False + if isinstance(child, Player): + assert child.play_button.isEnabled() + assert not child.pause_button.isEnabled() + assert not child.stop_button.isEnabled() child.play_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) - assert child.play_button.isEnabled() == False - assert child.pause_button.isEnabled() == True - assert child.stop_button.isEnabled() == True + assert not child.play_button.isEnabled() + assert child.pause_button.isEnabled() + assert child.stop_button.isEnabled() child.pause_button.click() # pause - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 0.0) assert thread_audio.message_stack[-2] == ("/pause", 1.0) assert thread_audio.message_stack[-3] == ("/stop", 1.0) - assert child.play_button.isEnabled() == False - assert child.pause_button.isEnabled() == True - assert child.stop_button.isEnabled() == True + assert not child.play_button.isEnabled() + assert child.pause_button.isEnabled() + assert child.stop_button.isEnabled() child.pause_button.click() # unpause - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/pause", 0.0) assert thread_audio.message_stack[-3] == ("/stop", 0.0) - assert child.play_button.isEnabled() == False - assert child.pause_button.isEnabled() == True - assert child.stop_button.isEnabled() == True + assert not child.play_button.isEnabled() + assert child.pause_button.isEnabled() + assert child.stop_button.isEnabled() child.stop_button.click() # stop - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 0.0) assert thread_audio.message_stack[-2] == ("/stop", 1.0) - assert child.play_button.isEnabled() == False - assert child.pause_button.isEnabled() == False - assert child.stop_button.isEnabled() == False + assert not child.play_button.isEnabled() + assert not child.pause_button.isEnabled() + assert not child.stop_button.isEnabled() test_gui.close() thread_audio.stop(0.1) QTest.qWait(1000) # reset file - assert gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().isChecked() == True - gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().isChecked() == False - assert gui_load.structure["Page 1"]["Question 1"]["play_once"] == False + assert gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert not gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert not gui_load.structure["Page 1"]["Question 1"]["play_once"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest.txt")) test_gui = StackedWindowGui("./test/pltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: - assert child.play_button.isEnabled() == True - assert child.pause_button.isEnabled() == False - assert child.stop_button.isEnabled() == False + if isinstance(child, Player): + assert child.play_button.isEnabled() + assert not child.pause_button.isEnabled() + assert not child.stop_button.isEnabled() child.play_button.click() - QTest.qWait(100) - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) - assert child.play_button.isEnabled() == True - assert child.pause_button.isEnabled() == True - assert child.stop_button.isEnabled() == True + assert child.play_button.isEnabled() + assert child.pause_button.isEnabled() + assert child.stop_button.isEnabled() child.pause_button.click() # pause - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 0.0) assert thread_audio.message_stack[-2] == ("/pause", 1.0) assert thread_audio.message_stack[-3] == ("/stop", 1.0) - assert child.play_button.isEnabled() == True - assert child.pause_button.isEnabled() == True - assert child.stop_button.isEnabled() == True + assert child.play_button.isEnabled() + assert child.pause_button.isEnabled() + assert child.stop_button.isEnabled() child.pause_button.click() # unpause - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/pause", 0.0) assert thread_audio.message_stack[-3] == ("/stop", 0.0) - assert child.play_button.isEnabled() == True - assert child.pause_button.isEnabled() == True - assert child.stop_button.isEnabled() == True + assert child.play_button.isEnabled() + assert child.pause_button.isEnabled() + assert child.stop_button.isEnabled() child.stop_button.click() # stop - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 0.0) assert thread_audio.message_stack[-2] == ("/stop", 1.0) - assert child.play_button.isEnabled() == True - assert child.pause_button.isEnabled() == False - assert child.stop_button.isEnabled() == False + assert child.play_button.isEnabled() + assert not child.pause_button.isEnabled() + assert not child.stop_button.isEnabled() test_gui.close() thread_audio.stop(0.1) QTest.qWait(1000) @@ -425,8 +428,8 @@ def test_play_once(gui_load, qtbot): def test_timer_and_two_pages(gui_load2, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load2.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -434,54 +437,53 @@ def test_timer_and_two_pages(gui_load2, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center(), delay=1) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center(), delay=1000) time_pos = find_row_by_label(gui_load2.gui.edit_layout, 'timer') # set timer value - assert gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().text() == '' - gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().setText("one") - gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().editingFinished.emit() - assert gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().text() == 'one' + assert gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().text() == '' + gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one") + gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().text() == 'one' assert gui_load2.structure["Page 1"]["Question 1"]["timer"] == 'one' QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure) - assert error_found == True - assert warning_found == False - gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().clear() - assert gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().text() == '' - gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().setText("1000") - gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().editingFinished.emit() - assert gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().text() == '1000' + assert error_found + assert not warning_found + gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + assert gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().text() == '' + gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1000") + gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().text() == '1000' assert gui_load2.structure["Page 1"]["Question 1"]["timer"] == '1000' QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load2.gui.refresh_button.click() - QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest2.txt")) test_gui = StackedWindowGui("./test/pltest2.txt") assert test_gui.Stack.count() == 2 hidden = None - print(thread_audio.message_stack) for child in test_gui.Stack.currentWidget().children(): - if type(child) == QLineEdit: + if isinstance(child, QLineEdit): hidden = child for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: - assert child.play_button.isEnabled() == True - assert hidden.isHidden() == True - assert hidden.isVisible() == False + if isinstance(child, Player): + assert child.play_button.isEnabled() + assert hidden.isHidden() + assert not hidden.isVisible() child.play_button.click() QTest.qWait(2000) - print(thread_audio.message_stack) + assert child.play_button.isEnabled() + assert child.timer.remainingTime() <= 0 + assert not hidden.isHidden() + assert hidden.isVisible() + time.sleep(2) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) - assert child.play_button.isEnabled() == True - assert child.timer.remainingTime() <= 0 - assert hidden.isHidden() == False - assert hidden.isVisible() == True QTest.qWait(3000) test_gui.close() @@ -494,42 +496,40 @@ def test_timer_and_two_pages(gui_load2, qtbot): assert test_gui.Stack.count() == 2 hidden = None for child in test_gui.Stack.currentWidget().children(): - if type(child) == QLineEdit: + if isinstance(child, QLineEdit): hidden = child for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: - assert child.play_button.isEnabled() == True - assert hidden.isHidden() == True - assert hidden.isVisible() == False + if isinstance(child, Player): + assert child.play_button.isEnabled() + assert hidden.isHidden() + assert not hidden.isVisible() child.play_button.click() QTest.qWait(500) child.stop_button.click() - assert hidden.isHidden() == True - assert hidden.isVisible() == False - QTest.qWait(1000) - print(thread_audio.message_stack) + assert hidden.isHidden() + assert not hidden.isVisible() + time.sleep(5) assert thread_audio.message_stack[-7] == ("/action", 40161) assert thread_audio.message_stack[-3] == ("/play", 1.0) assert thread_audio.message_stack[-4] == ("/stop", 0.0) assert thread_audio.message_stack[-1] == ("/play", 0.0) assert thread_audio.message_stack[-2] == ("/stop", 1.0) QTest.qWait(700) - assert hidden.isHidden() == True - assert hidden.isVisible() == False + assert hidden.isHidden() + assert not hidden.isVisible() # assert child.timer.remainingTime() <= 500 assert child.countdown > 0 assert child.countdown == 1000 child.play_button.click() assert child.timer.remainingTime() >= 900 # timer is restarted QTest.qWait(500) - assert hidden.isHidden() == True - assert hidden.isVisible() == False + assert hidden.isHidden() + assert not hidden.isVisible() QTest.qWait(700) assert child.timer.remainingTime() <= 0 - assert hidden.isHidden() == False - assert hidden.isVisible() == True - QTest.qWait(2000) - print(thread_audio.message_stack) + assert not hidden.isHidden() + assert hidden.isVisible() + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) # TODO in reality REAPER should ping back stop, but this doesn't work with the MockReceiver @@ -543,23 +543,22 @@ def test_timer_and_two_pages(gui_load2, qtbot): assert test_gui.Stack.count() == 2 hidden = None for child in test_gui.Stack.currentWidget().children(): - if type(child) == QLineEdit: + if isinstance(child, QLineEdit): hidden = child for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: - assert child.play_button.isEnabled() == True - assert hidden.isHidden() == True - assert hidden.isVisible() == False + if isinstance(child, Player): + assert child.play_button.isEnabled() + assert hidden.isHidden() + assert not hidden.isVisible() child.play_button.click() QTest.qWait(500) child.pause_button.click() - assert hidden.isHidden() == True - assert hidden.isVisible() == False + assert hidden.isHidden() + assert not hidden.isVisible() QTest.qWait(700) - assert hidden.isHidden() == True - assert hidden.isVisible() == False - QTest.qWait(2000) - print(thread_audio.message_stack) + assert hidden.isHidden() + assert not hidden.isVisible() + time.sleep(5) assert thread_audio.message_stack[-8] == ("/action", 40161) assert thread_audio.message_stack[-4] == ("/play", 1.0) assert thread_audio.message_stack[-5] == ("/stop", 0.0) @@ -575,8 +574,9 @@ def test_timer_and_two_pages(gui_load2, qtbot): assert child.timer.remainingTime() > 0 QTest.qWait(700) assert child.timer.remainingTime() <= 0 - assert hidden.isHidden() == False - assert hidden.isVisible() == True + assert not hidden.isHidden() + assert hidden.isVisible() + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/pause", 0.0) assert thread_audio.message_stack[-3] == ("/stop", 0.0) @@ -586,36 +586,36 @@ def test_timer_and_two_pages(gui_load2, qtbot): # reset file os.remove("./test/results/results_pl.csv") - gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().clear() - gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().editingFinished.emit() + gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load2.structure["Page 1"]["Question 1"]["timer"] == '' QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load2.gui.refresh_button.click() assert "timer" not in gui_load2.structure["Page 1"]["Question 1"].keys() - QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest2.txt")) test_gui = StackedWindowGui("./test/pltest2.txt") assert test_gui.Stack.count() == 2 hidden = None for child in test_gui.Stack.currentWidget().children(): - if type(child) == QLineEdit: + if isinstance(child, QLineEdit): hidden = child for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: - assert child.play_button.isEnabled() == True - assert hidden.isHidden() == False - assert hidden.isVisible() == True + if isinstance(child, Player): + assert child.play_button.isEnabled() + assert not hidden.isHidden() + assert hidden.isVisible() child.play_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_pl.csv', mode='r') as file: @@ -623,11 +623,11 @@ def test_timer_and_two_pages(gui_load2, qtbot): for lines in csv_file: results = lines assert len(results) == 5 - assert lines[0] == '1' # participant number - assert re.match(r'\[\d.\d+]', lines[1]) # list of duration - assert lines[2] == '' # text field - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\[\d.\d+]', results[1]) # list of duration + assert results[2] == '' # text field + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp os.remove("./test/results/results_pl.csv") thread_audio.stop(0.1) QTest.qWait(1000) @@ -638,8 +638,8 @@ def test_timer_and_two_pages(gui_load2, qtbot): def test_play_button_text(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -647,7 +647,7 @@ def test_play_button_text(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) # change text gui_load.structure["Page 1"]["Question 1"]["play_button_text"] = "Click me" @@ -656,20 +656,20 @@ def test_play_button_text(gui_load, qtbot): assert gui_load.structure["Page 1"]["Question 1"]["play_button_text"] == "Click me" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest.txt")) test_gui = StackedWindowGui("./test/pltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): assert child.play_button.text() == "Click me" - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/action", 40297) QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread_audio.stop(0.1) QTest.qWait(1000) @@ -679,9 +679,9 @@ def test_play_button_text(gui_load, qtbot): assert "play_button_text" not in gui_load.structure["Page 1"]["Question 1"].keys() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) os.remove("./test/results/results_pl.csv") gui_load.close() @@ -692,7 +692,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_pl.csv', mode='r') as file: @@ -701,15 +701,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pl' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pl' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '[]' # not played yet - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '[]' # not played yet + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp assert thread_audio.message_stack[-1] == ("/action", 40297) os.remove("./test/results/results_pl.csv") thread_audio.stop(0.1) @@ -721,11 +721,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_pl.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -733,15 +733,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pl' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pl' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '[]' # not played yet - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '[]' # not played yet + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp assert thread_audio.message_stack[-1] == ("/action", 40297) os.remove(res_file) thread_audio.stop(0.1) @@ -754,17 +754,17 @@ def test_execute_questionnaire(run, qtbot): os.remove("./test/results/results_pl.csv") assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): child.playing = False child.play_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_pl.csv', mode='r') as file: @@ -773,10 +773,10 @@ def test_execute_questionnaire(run, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert re.match(r'\[\d.\d+]', lines[1]) # list of duration - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\[\d.\d+]', results[1]) # list of duration + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pl.csv") thread_audio.stop(0.1) QTest.qWait(1000) @@ -787,19 +787,19 @@ def test_execute_questionnaire_blocked(run, qtbot): with mock_file(r'./test/results/results_pl.csv'): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): child.playing = False child.play_button.click() - QTest.qWait(5000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -807,15 +807,15 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pl' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pl' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert re.match(r'\[\d.\d+]', lines[1]) - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert re.match(r'\[\d.\d+]', results[1]) + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) thread_audio.stop(0.1) QTest.qWait(1000) @@ -825,8 +825,8 @@ def test_execute_questionnaire_blocked(run, qtbot): def test_buttons(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -834,46 +834,45 @@ def test_buttons(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) btn_pos = find_row_by_label(gui_load.gui.edit_layout, 'buttons') - for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, 1).count()): - assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().isChecked() == True + for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).count()): + assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().isChecked() assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == player_buttons # try to add a non-defined button gui_load.structure["Page 1"]["Question 1"]["buttons"].append("Record") QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # no button chosen -> warning plus autoplay on load - for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, 1).count()): - gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().click() - assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().isChecked() == False + for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).count()): + gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().click() + assert not gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().isChecked() assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == [] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest.txt")) QTest.qWait(2000) QTimer.singleShot(150, handle_dialog_warning) test_gui = StackedWindowGui("./test/pltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): assert child.buttons == [] - assert child.playing == True - QTest.qWait(5000) - print(thread_audio.message_stack) + assert child.playing + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread_audio.stop(0.1) QTest.qWait(1000) @@ -884,44 +883,44 @@ def test_buttons(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert re.match(r'\[\d.\d+]', lines[1]) # list of duration - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\[\d.\d+]', results[1]) # list of duration + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pl.csv") # just stop button - gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(2).widget().click() - assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(2).widget().isChecked() == True + gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(2).widget().click() + assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(2).widget().isChecked() assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == ["Stop"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest.txt")) QTest.qWait(3000) QTimer.singleShot(150, handle_dialog_warning) test_gui = StackedWindowGui("./test/pltest.txt") assert test_gui.Stack.count() == 1 - QTest.qWait(3000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): assert child.buttons == ["Stop"] - assert child.playing == True - assert child.stop_button.isEnabled() == True + assert child.playing + assert child.stop_button.isEnabled() assert child.stop_button is not None child.stop_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 0.0) assert thread_audio.message_stack[-2] == ("/stop", 1.0) - assert child.playing == False - assert child.stop_button.isEnabled() == False + assert not child.playing + assert not child.stop_button.isEnabled() QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread_audio.stop(0.1) QTest.qWait(1000) @@ -931,69 +930,69 @@ def test_buttons(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert re.match(r'\[\d.\d+]', lines[1]) # list of duration - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\[\d.\d+]', results[1]) # list of duration + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pl.csv") # stop and pause - gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(1).widget().click() - assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(1).widget().isChecked() == True + gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().click() + assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().isChecked() assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == ["Pause", "Stop"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest.txt")) QTimer.singleShot(150, handle_dialog_warning) test_gui = StackedWindowGui("./test/pltest.txt") - QTest.qWait(5000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): assert child.buttons == ["Pause", "Stop"] - assert child.playing == True - assert child.pause_button.isEnabled() == True - assert child.pause_button.isChecked() == False + assert child.playing + assert child.pause_button.isEnabled() + assert not child.pause_button.isChecked() assert child.pause_button is not None - assert child.stop_button.isEnabled() == True + assert child.stop_button.isEnabled() assert child.stop_button is not None child.pause_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 0.0) assert thread_audio.message_stack[-2] == ("/pause", 1.0) assert thread_audio.message_stack[-3] == ("/stop", 1.0) - assert child.playing == False - assert child.pause_button.isEnabled() == True - assert child.pause_button.isChecked() == True + assert not child.playing + assert child.pause_button.isEnabled() + assert child.pause_button.isChecked() assert child.pause_button is not None - assert child.stop_button.isEnabled() == True + assert child.stop_button.isEnabled() assert child.stop_button is not None child.pause_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/pause", 0.0) assert thread_audio.message_stack[-3] == ("/stop", 0.0) - assert child.playing == True - assert child.pause_button.isEnabled() == True - assert child.pause_button.isChecked() == False + assert child.playing + assert child.pause_button.isEnabled() + assert not child.pause_button.isChecked() assert child.pause_button is not None - assert child.stop_button.isEnabled() == True + assert child.stop_button.isEnabled() assert child.stop_button is not None child.stop_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-1] == ("/play", 0.0) assert thread_audio.message_stack[-2] == ("/stop", 1.0) - assert child.playing == False - assert child.pause_button.isEnabled() == False - assert child.stop_button.isEnabled() == False + assert not child.playing + assert not child.pause_button.isEnabled() + assert not child.stop_button.isEnabled() QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread_audio.stop(0.1) QTest.qWait(1000) @@ -1003,46 +1002,46 @@ def test_buttons(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert re.match(r'\[\d.\d+, \d.\d+]', lines[1]) # list of duration - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\[\d.\d+, \d.\d+]', results[1]) # list of duration + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pl.csv") # just play button - gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(2).widget().click() - assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(2).widget().isChecked() == False - gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(1).widget().click() - assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(1).widget().isChecked() == False - gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(0).widget().click() - assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(0).widget().isChecked() == True + gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(2).widget().click() + assert not gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(2).widget().isChecked() + gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().click() + assert not gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().isChecked() + gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(0).widget().click() + assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(0).widget().isChecked() assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == ["Play"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest.txt")) test_gui = StackedWindowGui("./test/pltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): assert child.buttons == ["Play"] - assert child.playing == False + assert not child.playing assert child.play_button is not None child.play_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) - assert child.playing == True + assert child.playing child.play_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() thread_audio.stop(0.1) QTest.qWait(1000) @@ -1052,31 +1051,31 @@ def test_buttons(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert re.match(r'\[\d.\d+, \d.\d+]', lines[1]) # list of duration - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\[\d.\d+, \d.\d+]', results[1]) # list of duration + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pl.csv") # reset file - for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, 1).count()): - if not gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().isChecked(): - gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().click() - assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().isChecked() == True + for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).count()): + if not gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().isChecked(): + gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().click() + assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().isChecked() assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == player_buttons QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.close() def test_video(gui_load2, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load2.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -1084,18 +1083,18 @@ def test_video(gui_load2, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) vid_pos = find_row_by_label(gui_load2.gui.edit_layout, 'video') - assert gui_load2.gui.edit_layout.itemAt(vid_pos, 1).widget().text() == '' + assert gui_load2.gui.edit_layout.itemAt(vid_pos, QFormLayout.ItemRole.FieldRole).widget().text() == '' vid_path = "./some_video.mp4" - gui_load2.gui.edit_layout.itemAt(vid_pos, 1).widget().setText(vid_path) - gui_load2.gui.edit_layout.itemAt(vid_pos, 1).widget().editingFinished.emit() - assert gui_load2.gui.edit_layout.itemAt(vid_pos, 1).widget().text() == vid_path + gui_load2.gui.edit_layout.itemAt(vid_pos, QFormLayout.ItemRole.FieldRole).widget().setText(vid_path) + gui_load2.gui.edit_layout.itemAt(vid_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load2.gui.edit_layout.itemAt(vid_pos, QFormLayout.ItemRole.FieldRole).widget().text() == vid_path QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure) - assert error_found == False - assert warning_found == True + assert not error_found + assert warning_found # set video ip/port gui_load2.structure["video_ip"] = "127.0.0.1" @@ -1103,25 +1102,25 @@ def test_video(gui_load2, qtbot): gui_load2.structure["video_player"] = "VLC" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load2.gui.refresh_button.click() - QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest2.txt")) test_gui = StackedWindowGui("./test/pltest2.txt") assert test_gui.Stack.count() == 2 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): child.play_button.click() QTest.qWait(500) child.pause_button.click() QTest.qWait(500) child.play_button.click() QTest.qWait(2000) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() assert thread_video.message_stack[-6] == ("/vlc_start", './some_video.mp4') assert thread_video.message_stack[-5] == ("/vlc_pause", 1) @@ -1129,7 +1128,6 @@ def test_video(gui_load2, qtbot): assert thread_video.message_stack[-3] == ("/vlc_stop", 1) assert thread_video.message_stack[-2] == ("/vlc_still", 1) assert thread_video.message_stack[-1] == ("/vlc_finish", 1) - print(thread_video.message_stack) thread_audio.stop(0.1) thread_video.stop(0.1) QTest.qWait(1000) @@ -1138,23 +1136,22 @@ def test_video(gui_load2, qtbot): # MadMapper gui_load2.structure["video_player"] = "MadMapper" gui_load2.gui.refresh_button.click() - QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest2.txt")) test_gui = StackedWindowGui("./test/pltest2.txt") assert test_gui.Stack.count() == 2 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): child.play_button.click() QTest.qWait(500) child.pause_button.click() QTest.qWait(500) child.play_button.click() QTest.qWait(2000) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) QTimer.singleShot(200, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() - print(thread_video.message_stack) # the reply is a bis fucked up since it is configured for Reaper assert thread_video.message_stack[0] == ("/medias/selected/position_sec", 0.0) assert thread_video.message_stack[1] == ('/cues/Bank-1/scenes/by_name/./some_video.mp4', 1) assert thread_video.message_stack[3] == ("/play", 1) @@ -1170,7 +1167,7 @@ def test_video(gui_load2, qtbot): gui_load2.structure.pop("video_port") gui_load2.structure.pop("video_player") gui_load2.structure["Page 1"]["Question 1"].pop("video") - QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load2.close() @@ -1180,8 +1177,8 @@ def test_pupil(gui_load, qtbot, capfd): open_pupil() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -1189,16 +1186,16 @@ def test_pupil(gui_load, qtbot, capfd): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center(), delay=1) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center(), delay=1000) pupil_pos = find_row_by_label(gui_load.gui.edit_layout, 'pupil') - assert gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().text() == '' + assert gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().text() == '' assert "pupil" not in gui_load.structure["Page 1"]["Question 1"].keys() # try to set pupil annotation text without setting global pupil ip/port - gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().setText("Custom Annotation") - gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Custom Annotation") + gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() # QTimer.singleShot(200, handle_dialog_error) gui_load.gui.load_preview() # QTimer.singleShot(200, handle_dialog_error) @@ -1206,37 +1203,37 @@ def test_pupil(gui_load, qtbot, capfd): assert gui_load.structure["Page 1"]["Question 1"]["pupil"] == "Custom Annotation" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True + assert not error_found + assert warning_found # set pupil ip/port gui_load.structure["pupil_ip"] = "127.0.0.1" gui_load.structure["pupil_port"] = 50020 QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=1) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) prepare_listeners(ConfigObj("./test/pltest.txt")) test_gui = StackedWindowGui("./test/pltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Player: + if isinstance(child, Player): child.play_button.click() - QTest.qWait(2000) + time.sleep(5) assert thread_audio.message_stack[-5] == ("/action", 40161) assert thread_audio.message_stack[-1] == ("/play", 1.0) assert thread_audio.message_stack[-2] == ("/stop", 0.0) QTest.qWait(1000) - assert child.playing == True + assert child.playing out, err = capfd.readouterr() assert out.index("Trigger {'topic': 'annotation', 'label': 'Custom Annotation', 'timestamp':") != -1 - assert out.endswith(", 'duration': 1} Message forwarded.\n") == True + assert out.endswith(", 'duration': 1} Message forwarded.\n") QTest.qWait(2000) QTest.qWait(3000) QTimer.singleShot(2000, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=150) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=150) QTest.qWait(3000) test_gui.close() thread_audio.stop(0.1) @@ -1246,16 +1243,16 @@ def test_pupil(gui_load, qtbot, capfd): # reset file gui_load.structure.pop("pupil_ip") gui_load.structure.pop("pupil_port") - gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() gui_load.gui.load_preview() gui_load.gui.refresh_button.click() assert "pupil" not in gui_load.structure["Page 1"]["Question 1"].keys() QTimer.singleShot(250, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found QTest.qWait(2000) - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) QTest.qWait(1000) gui_load.close() diff --git a/test/RadioButton_test.py b/test/RadioButton_test.py index 95a0e89c815b0d1419f7482a5ec3b70eee46a826..c1e3f120c9a5c98b70bb9aa20840205907e156ae 100644 --- a/test/RadioButton_test.py +++ b/test/RadioButton_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of Answer_RadioButton.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, make_answers, QRadioButton @pytest.fixture @@ -27,19 +27,19 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -52,28 +52,28 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Radio" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Radio"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Radio"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["Radio"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Radio"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Radio"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["Radio"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == \ - str(default_values[layout.itemAt(row, 0).widget().text()]) - elif type(layout.itemAt(row, 1).widget()) == QRadioButton and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == \ + str(default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]) + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QRadioButton) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["Radio"][0].keys()) assert len(gui_init.undo_stack) == 3 # 2 for creating page & question, 1 for choosing Radio @@ -88,7 +88,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Radio"} for key, value in default_values.items(): - if key in fields_per_type["Radio"][0].keys(): + if key in fields_per_type["Radio"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -118,8 +118,8 @@ def test_create(gui_init, qtbot): def test_answers(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -127,71 +127,73 @@ def test_answers(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'answers') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[only one]") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[only one]") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[only one]" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]" + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]" assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one" # listify ran at refresh QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found _, bg = make_answers(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.gui.preview_gui.Stack.currentWidget(), gui_load.structure["Page 1"]["Question 1"]['id']) assert len(bg.buttons()) == 1 - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("only one") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "only one" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("only one") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found _, bg = make_answers(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.gui.preview_gui.Stack.currentWidget(), gui_load.structure["Page 1"]["Question 1"]['id']) assert len(bg.buttons()) == 1 - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[one, two, three]") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[one, two, three]" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[one, two, three]") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[one, two, three]" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[one, two, three]" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert gui_load.structure["Page 1"]["Question 1"]["answers"] == ["one", "two", "three"] _, bg = make_answers(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.gui.preview_gui.Stack.currentWidget(), gui_load.structure["Page 1"]["Question 1"]['id']) assert len(bg.buttons()) == 3 - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True + assert not error_found + assert warning_found _, bg = make_answers(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.gui.preview_gui.Stack.currentWidget(), gui_load.structure["Page 1"]["Question 1"]['id']) assert len(bg.buttons()) == 1 - QTimer.singleShot(150, handle_dialog_no_save) + + gui_load.structure["Page 1"]["Question 1"]["answers"] = ["yes", "no"] + gui_load.save() gui_load.close() @@ -199,8 +201,8 @@ def test_answers(gui_load, qtbot): def test_start_id(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -208,32 +210,32 @@ def test_start_id(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("99") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "99" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "99" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "99" + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "99" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/rbtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == QRadioButton: + if isinstance(child, QRadioButton): child.click() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_rb.csv', mode='r') as file: @@ -242,17 +244,17 @@ def test_start_id(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '100' # second/last box checked and starts with 99 - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '100' # second/last box checked and starts with 99 + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_rb.csv") # -------- -1 --------- QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -260,30 +262,30 @@ def test_start_id(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("-1") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "-1" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "-1" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "-1" + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "-1" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # ---------0-------- QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -291,32 +293,32 @@ def test_start_id(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("0") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "0" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "0" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "0" + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/rbtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == QRadioButton: + if isinstance(child, QRadioButton): child.click() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_rb.csv', mode='r') as file: @@ -325,10 +327,10 @@ def test_start_id(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '1' # second/last box checked and starts with 0 - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '1' # second/last box checked and starts with 0 + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_rb.csv") gui_load.close() @@ -338,7 +340,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_rb.csv', mode='r') as file: @@ -347,15 +349,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'rb' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'rb' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '-1' # no radiobutton checked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '-1' # no radiobutton checked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_rb.csv") @@ -364,11 +366,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_rb.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -376,15 +378,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'rb' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'rb' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '-1' # no radiobutton checked - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '-1' # no radiobutton checked + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) @@ -392,11 +394,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): def test_execute_questionnaire(run, qtbot): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == QRadioButton: + if isinstance(child, QRadioButton): child.click() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_rb.csv', mode='r') as file: @@ -405,10 +407,10 @@ def test_execute_questionnaire(run, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '1' # second/last box checked and starts with 0 - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '1' # second/last box checked and starts with 0 + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_rb.csv") @@ -417,14 +419,14 @@ def test_execute_questionnaire_blocked(run, qtbot): with mock_file(r'./test/results/results_rb.csv'): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == QRadioButton: + if isinstance(child, QRadioButton): child.click() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -432,13 +434,13 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'rb' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'rb' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '1' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '1' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) diff --git a/test/RadioMatrix_test.py b/test/RadioMatrix_test.py index 09acdf862e50e2cc6b26be9a46e503216e00de30..d5364d60a75e57769c689b3673a5de12607394c2 100644 --- a/test/RadioMatrix_test.py +++ b/test/RadioMatrix_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of RadioMatrix.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, RadioMatrix, handle_dialog_warning, QRadioButton @pytest.fixture @@ -41,19 +41,19 @@ def run_2(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) # .setSelected(True) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -66,38 +66,38 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Matrix" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Matrix"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Matrix"][0][layout.itemAt(row, 0).widget().text()] == \ - 'QPlainTextEdit' else fields_per_type["Matrix"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Matrix"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Matrix"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == \ + 'QPlainTextEdit' else fields_per_type["Matrix"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == \ - str(default_values[layout.itemAt(row, 0).widget().text()]) - elif type(layout.itemAt(row, 1).widget()) == QRadioButton and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == \ + str(default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]) + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QRadioButton) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["Matrix"][0].keys()) assert len(gui_init.undo_stack) == 13 # 2 for creating page & question, 11 for choosing Matrix @@ -112,7 +112,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Matrix"} for key, value in default_values.items(): - if key in fields_per_type["Matrix"][0].keys(): + if key in fields_per_type["Matrix"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -143,8 +143,8 @@ def test_create(gui_init, qtbot): def test_answers(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -152,148 +152,153 @@ def test_answers(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'answers') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[only one]") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[only one]") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[only one]" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]" + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]" assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one" # listify already ran QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): for bg in child.buttongroups: assert len(bg.buttons()) == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() ''' QTest.qWait(1000) # TODO for child in gui_load.gui.preview_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): for bg in child.buttongroups: assert len(bg.buttons()) == 1 ''' - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("only one") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "only one" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("only one") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): for bg in child.buttongroups: assert len(bg.buttons()) == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() ''' for child in gui_load.gui.preview_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): for bg in child.buttongroups: assert len(bg.buttons()) == 1 ''' - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[one, two, three]") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[one, two, three]" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[one, two, three]") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[one, two, three]" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[one, two, three]" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert gui_load.structure["Page 1"]["Question 1"]["answers"] == ["one", "two", "three"] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): for bg in child.buttongroups: assert len(bg.buttons()) == 3 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() ''' for child in gui_load.gui.preview_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): for bg in child.buttongroups: assert len(bg.buttons()) == 3 ''' - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) QTimer.singleShot(150, handle_dialog_warning) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): for bg in child.buttongroups: assert len(bg.buttons()) == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() ''' for child in gui_load.gui.preview_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): for bg in child.buttongroups: assert len(bg.buttons()) == 1 ''' - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("1, 2, 3, 4, 5") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "1, 2, 3, 4, 5" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("1, 2, 3, 4, 5") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3, 4, 5" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "1, 2, 3, 4, 5" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert gui_load.structure["Page 1"]["Question 1"]["answers"] == (1, 2, 3, 4, 5) - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): for bg in child.buttongroups: assert len(bg.buttons()) == 5 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() gui_load.close() @@ -305,8 +310,8 @@ def test_start_id(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -314,33 +319,34 @@ def test_start_id(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("99") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "99" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "99" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "99" + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "99" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: - for bg in range(len(child.buttongroups)): - child.buttongroups[bg].buttons()[bg].click() + if isinstance(child, RadioMatrix.RadioMatrix): + for bg, grp in enumerate(child.buttongroups): + grp.buttons()[bg].click() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_rm.csv', mode='r') as file: @@ -349,19 +355,19 @@ def test_start_id(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 6 - assert lines[0] == '1' # participant number - assert lines[1] == '99' # first button in first row clicked, id starts with 99 - assert lines[2] == '100' # second button in second row clicked, id starts with 99 - assert lines[3] == '[1, 2]' # order - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '99' # first button in first row clicked, id starts with 99 + assert results[2] == '100' # second button in second row clicked, id starts with 99 + assert results[3] == '[1, 2]' # order + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove("./test/results/results_rm.csv") # -------- -1 --------- QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -369,30 +375,30 @@ def test_start_id(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("-1") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "-1" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "-1" QTimer.singleShot(150, handle_dialog_error) gui_load.gui.load_preview() QTimer.singleShot(150, handle_dialog_error) gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "-1" + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "-1" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # ---------0-------- QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -400,33 +406,34 @@ def test_start_id(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("0") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "0" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "0" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "0" + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: - for bg in range(len(child.buttongroups)): - child.buttongroups[bg].buttons()[bg].click() + if isinstance(child, RadioMatrix.RadioMatrix): + for bg, grp in enumerate(child.buttongroups): + grp.buttons()[bg].click() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_rm.csv', mode='r') as file: @@ -435,12 +442,12 @@ def test_start_id(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 6 - assert lines[0] == '1' # participant number - assert lines[1] == '0' # first button in first row clicked, id starts with 0 - assert lines[2] == '1' # second button in second row clicked, id starts with 0 - assert lines[3] == '[1, 2]' # order - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '0' # first button in first row clicked, id starts with 0 + assert results[2] == '1' # second button in second row clicked, id starts with 0 + assert results[3] == '[1, 2]' # order + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove("./test/results/results_rm.csv") gui_load.close() @@ -449,8 +456,8 @@ def test_start_id(gui_load, qtbot): def test_questions(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -458,118 +465,123 @@ def test_questions(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) quest_pos = find_row_by_label(gui_load.gui.edit_layout, 'questions') - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("[only one]") - assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "[only one]" - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[only one]") + assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]" + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "[only one]" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "[only one]" + assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]" assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "only one" # listify already ran QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): assert len(child.buttongroups) == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("only one") - assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "only one" - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("only one") + assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one" + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "only one" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): assert len(child.buttongroups) == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("[one, two, three]") - assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "[one, two, three]" - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[one, two, three]") + assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[one, two, three]" + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "[one, two, three]" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert gui_load.structure["Page 1"]["Question 1"]["questions"] == ["one", "two", "three"] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): assert len(child.buttongroups) == 3 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("") - assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "" - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("") + assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) QTimer.singleShot(150, handle_dialog_warning) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): assert len(child.buttongroups) == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("I like it very much., I don't like it at all.") - assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "I like it very much., I don't like it at all." - gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("I like it very much., I don't like it at all.") + assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "I like it very much., I don't like it at all." + gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "I like it very much., I don't like it at all." QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert gui_load.structure["Page 1"]["Question 1"]["questions"] == ["I like it very much.", "I don't like it at all."] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + QTest.qWait(2000) test_gui = StackedWindowGui("./test/rmtest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: + if isinstance(child, RadioMatrix.RadioMatrix): assert len(child.buttongroups) == 2 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() gui_load.close() @@ -581,7 +593,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_rm.csv', mode='r') as file: @@ -590,19 +602,19 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'rm_1' # first row - assert lines[2] == 'rm_2' # second row - assert lines[3] == 'rm_order' # second row - assert lines[4] == 'Start' - assert lines[5] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'rm_1' # first row + assert results[2] == 'rm_2' # second row + assert results[3] == 'rm_order' # second row + assert results[4] == 'Start' + assert results[5] == 'End' assert len(results) == 6 - assert lines[0] == '1' # participant number - assert lines[1] == '-1' # no radiobutton checked - assert lines[2] == '-1' # no radiobutton checked - assert lines[3] == '[1, 2]' # order - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '-1' # no radiobutton checked + assert results[2] == '-1' # no radiobutton checked + assert results[3] == '[1, 2]' # order + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove("./test/results/results_rm.csv") @@ -611,11 +623,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_rm.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -623,19 +635,19 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'rm_1' # first row - assert lines[2] == 'rm_2' # second row - assert lines[3] == 'rm_order' # second row - assert lines[4] == 'Start' - assert lines[5] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'rm_1' # first row + assert results[2] == 'rm_2' # second row + assert results[3] == 'rm_order' # second row + assert results[4] == 'Start' + assert results[5] == 'End' assert len(results) == 6 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '-1' # no radiobutton checked - assert lines[2] == '-1' # no radiobutton checked - assert lines[3] == '[1, 2]' # order - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '-1' # no radiobutton checked + assert results[2] == '-1' # no radiobutton checked + assert results[3] == '[1, 2]' # order + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove(res_file) @@ -645,12 +657,12 @@ def test_execute_questionnaire(run, qtbot): os.remove("./test/results/results_rm.csv") assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: - for bg in range(len(child.buttongroups)): - child.buttongroups[bg].button(bg).click() + if isinstance(child, RadioMatrix.RadioMatrix): + for bg, grp in enumerate(child.buttongroups): + grp.button(bg).click() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_rm.csv', mode='r') as file: @@ -659,12 +671,12 @@ def test_execute_questionnaire(run, qtbot): for lines in csv_file: results = lines assert len(results) == 6 - assert lines[0] == '1' # participant number - assert lines[1] == '0' # first button in first row clicked, id starts with 0 - assert lines[2] == '1' # second button in second row clicked, id starts with 0 - assert lines[3] == '[1, 2]' # order - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '0' # first button in first row clicked, id starts with 0 + assert results[2] == '1' # second button in second row clicked, id starts with 0 + assert results[3] == '[1, 2]' # order + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove("./test/results/results_rm.csv") @@ -673,15 +685,15 @@ def test_execute_questionnaire_blocked(run, qtbot): with mock_file(r'./test/results/results_rm.csv'): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: - for bg in range(len(child.buttongroups)): - child.buttongroups[bg].button(bg).click() + if isinstance(child, RadioMatrix.RadioMatrix): + for bg, grp in enumerate(child.buttongroups): + grp.button(bg).click() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -689,19 +701,19 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'rm_1' # first row - assert lines[2] == 'rm_2' # second row - assert lines[3] == 'rm_order' # second row - assert lines[4] == 'Start' - assert lines[5] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'rm_1' # first row + assert results[2] == 'rm_2' # second row + assert results[3] == 'rm_order' # second row + assert results[4] == 'Start' + assert results[5] == 'End' assert len(results) == 6 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '0' - assert lines[2] == '1' - assert lines[3] == '[1, 2]' # order - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '0' + assert results[2] == '1' + assert results[3] == '[1, 2]' # order + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5]) # timestamp os.remove(res_file) @@ -711,9 +723,9 @@ def test_two_pages(run_2, qtbot): os.remove("./test/results/results_rm.csv") assert run_2.Stack.count() == 2 - QTest.mouseClick(run_2.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run_2.forwardbutton, Qt.MouseButton.LeftButton) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run_2.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run_2.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_rm.csv', mode='r') as file: @@ -722,25 +734,25 @@ def test_two_pages(run_2, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'rm_1' # first row - assert lines[2] == 'rm_2' # second row - assert lines[3] == 'rm_order' # second row - assert lines[4] == 'rm2_1' # first row - assert lines[5] == 'rm2_2' # second row - assert lines[6] == 'rm2_order' # second row - assert lines[7] == 'Start' - assert lines[8] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'rm_1' # first row + assert results[2] == 'rm_2' # second row + assert results[3] == 'rm_order' # second row + assert results[4] == 'rm2_1' # first row + assert results[5] == 'rm2_2' # second row + assert results[6] == 'rm2_order' # second row + assert results[7] == 'Start' + assert results[8] == 'End' assert len(results) == 9 - assert lines[0] == '1' # participant number - assert lines[1] == '-1' # no radiobutton checked - assert lines[2] == '-1' # no radiobutton checked - assert lines[3] == '[1, 2]' # order - assert lines[4] == '-1' # no radiobutton checked - assert lines[5] == '-1' # no radiobutton checked - assert lines[6] == '[1, 2]' # order - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[8]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '-1' # no radiobutton checked + assert results[2] == '-1' # no radiobutton checked + assert results[3] == '[1, 2]' # order + assert results[4] == '-1' # no radiobutton checked + assert results[5] == '-1' # no radiobutton checked + assert results[6] == '[1, 2]' # order + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[8]) # timestamp os.remove("./test/results/results_rm.csv") @@ -751,8 +763,8 @@ def test_randomize(gui_load_2, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load_2.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -760,52 +772,52 @@ def test_randomize(gui_load_2, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load_2.gui.edit_layout, 'randomize') - gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().click() - assert gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().isChecked() == True - assert gui_load_2.structure["Page 1"]["Question 1"]["randomize"] == True + gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load_2.structure["Page 1"]["Question 1"]["randomize"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv.setCurrentItem(tv.topLevelItem(0).child(1).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load_2.gui.edit_layout, 'randomize') - gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().click() - assert gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().isChecked() == True - assert gui_load_2.structure["Page 2"]["Question 1"]["randomize"] == True + gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load_2.structure["Page 2"]["Question 1"]["randomize"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load_2, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load_2, 's', modifier=Qt.KeyboardModifier.ControlModifier) test_gui = StackedWindowGui("./test/rm_two_pages.txt") assert test_gui.Stack.count() == 2 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: - for bg in range(len(child.buttongroups)): - child.buttongroups[bg].buttons()[bg].click() + if isinstance(child, RadioMatrix.RadioMatrix): + for bg, grp in enumerate(child.buttongroups): + grp.buttons()[bg].click() questions1 = child.questions - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: - for bg in range(len(child.buttongroups)): - child.buttongroups[bg].buttons()[bg].click() + if isinstance(child, RadioMatrix.RadioMatrix): + for bg, grp in enumerate(child.buttongroups): + grp.buttons()[bg].click() questions2 = child.questions - for quest in range(len(questions1)): - assert questions2[quest].text() == questions1[quest].text() + for quest, qst in enumerate(questions1): + assert questions2[quest].text() == qst.text() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_rm.csv', mode='r') as file: @@ -814,19 +826,19 @@ def test_randomize(gui_load_2, qtbot): for lines in csv_file: results = lines assert len(results) == 9 - assert lines[0] == '1' # participant number - assert lines[1] == lines[4] - assert lines[2] == lines[5] - assert lines[3] == lines[6] # order - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[8]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == results[4] + assert results[2] == results[5] + assert results[3] == results[6] # order + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[8]) # timestamp os.remove("./test/results/results_rm.csv") # --set to False -- QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load_2.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -834,52 +846,54 @@ def test_randomize(gui_load_2, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load_2.gui.edit_layout, 'randomize') - gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().click() - assert gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().isChecked() == False - assert gui_load_2.structure["Page 1"]["Question 1"]["randomize"] == False + gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert not gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert not gui_load_2.structure["Page 1"]["Question 1"]["randomize"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv.setCurrentItem(tv.topLevelItem(0).child(1).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load_2.gui.edit_layout, 'randomize') - gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().click() - assert gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().isChecked() == False - assert gui_load_2.structure["Page 2"]["Question 1"]["randomize"] == False + gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert not gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert not gui_load_2.structure["Page 2"]["Question 1"]["randomize"] QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load_2, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load_2, 's', modifier=Qt.KeyboardModifier.ControlModifier) + gui_load_2.save() + QTest.qWait(1000) test_gui = StackedWindowGui("./test/rm_two_pages.txt") assert test_gui.Stack.count() == 2 for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: - for bg in range(len(child.buttongroups)): - child.buttongroups[bg].buttons()[bg].click() + if isinstance(child, RadioMatrix.RadioMatrix): + for bg, grp in enumerate(child.buttongroups): + grp.buttons()[bg].click() questions1 = child.questions - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) for child in test_gui.Stack.currentWidget().children(): - if type(child) == RadioMatrix.RadioMatrix: - for bg in range(len(child.buttongroups)): - child.buttongroups[bg].buttons()[bg].click() + if isinstance(child, RadioMatrix.RadioMatrix): + for bg, grp in enumerate(child.buttongroups): + grp.buttons()[bg].click() questions2 = child.questions - for quest in range(len(questions1)): - assert questions2[quest].text() == questions1[quest].text() + for quest, qst in enumerate(questions1): + assert questions2[quest].text() == qst.text() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_rm.csv', mode='r') as file: @@ -888,11 +902,11 @@ def test_randomize(gui_load_2, qtbot): for lines in csv_file: results = lines assert len(results) == 9 - assert lines[0] == '1' # participant number - assert lines[1] == lines[4] - assert lines[2] == lines[5] - assert lines[3] == lines[6] # order - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[8]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == results[4] + assert results[2] == results[5] + assert results[3] == results[6] # order + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[8]) # timestamp os.remove("./test/results/results_rm.csv") gui_load_2.close() diff --git a/test/Slider_test.py b/test/Slider_test.py index 62ec60c5a6334ba1b5fd5a2d638c47ab86ca3985..7186654ffa2f2d5c85b4f12bb80ecf09e00799b8 100644 --- a/test/Slider_test.py +++ b/test/Slider_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of AnswerSlider.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, Slider, LabeledSlider, QRadioButton @pytest.fixture @@ -27,19 +27,19 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) # .setSelected(True) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -52,31 +52,31 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Slider" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Slider"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Slider"][0][layout.itemAt(row, 0).widget().text()] == \ - 'QPlainTextEdit' else fields_per_type["Slider"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Slider"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Slider"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == \ + 'QPlainTextEdit' else fields_per_type["Slider"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == \ - str(default_values[layout.itemAt(row, 0).widget().text()]) - elif type(layout.itemAt(row, 1).widget()) == QRadioButton and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == \ + str(default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]) + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QRadioButton) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["Slider"][0].keys()) assert len(gui_init.undo_stack) == 6 # 2 for creating page & question, 4 for choosing Slider @@ -91,7 +91,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Slider"} for key, value in default_values.items(): - if key in fields_per_type["Slider"][0].keys(): + if key in fields_per_type["Slider"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -122,8 +122,8 @@ def test_create(gui_init, qtbot): def test_labels(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -131,94 +131,94 @@ def test_labels(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) labels_pos = find_row_by_label(gui_load.gui.edit_layout, 'label') cb_pos = find_row_by_label(gui_load.gui.edit_layout, 'labelled') # activate labels assert "label" not in gui_load.structure["Page 1"]["Question 1"].keys() - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == False - gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == True - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == True + assert not gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled() + gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert "label" not in gui_load.structure["Page 1"]["Question 1"].keys() - assert gui_load.structure["Page 1"]["Question 1"]["labelled"] == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert gui_load.structure["Page 1"]["Question 1"]["labelled"] + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == LabeledSlider.LabeledSlider: + if isinstance(child, LabeledSlider.LabeledSlider): assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]), - int(gui_load.structure["Page 1"]["Question 1"]["max"])+1)) + int(gui_load.structure["Page 1"]["Question 1"]["max"]) + 1)) assert child.levels[0][0] == child.sl.minimum() assert child.levels[0][1] == gui_load.structure["Page 1"]["Question 1"]["min"] assert child.levels[-1][0] == child.sl.maximum() assert child.levels[-1][1] == gui_load.structure["Page 1"]["Question 1"]["max"] - elif type(child) == Slider.Slider: + elif isinstance(child, Slider.Slider): assert False QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() # adding too little labels -> error - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("only one") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "only one" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("only one") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["label"] == "only one" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, three") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, three" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, three") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, three" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["label"] == "one, two, three" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) assert gui_load.structure["Page 1"]["Question 1"]["label"] == ["one", "two", "three"] - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # adding too many labels -> error - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, three, four, five, six") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, three, four, five, six" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, three, four, five, six") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, three, four, five, six" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["label"] == "one, two, three, four, five, six" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) assert gui_load.structure["Page 1"]["Question 1"]["label"] == ["one", "two", "three", "four", "five", "six"] - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # correct number of labels - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, three, four, five") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, three, four, five" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, three, four, five") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, three, four, five" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["label"] == "one, two, three, four, five" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) assert gui_load.structure["Page 1"]["Question 1"]["label"] == ["one", "two", "three", "four", "five"] - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == LabeledSlider.LabeledSlider: + if isinstance(child, LabeledSlider.LabeledSlider): assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]), int(gui_load.structure["Page 1"]["Question 1"]["max"]) + 1)) assert child.levels[0][0] == child.sl.minimum() @@ -226,50 +226,50 @@ def test_labels(gui_load, qtbot): assert child.levels[-1][0] == child.sl.maximum() assert child.levels[-1][1] == gui_load.structure["Page 1"]["Question 1"]["label"][-1] QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() # adding too many labels fields -> error - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("[0, two, three], [4, five, six]") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "[0, two, three], [4, five, six]" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("[0, two, three], [4, five, six]") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[0, two, three], [4, five, six]" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["label"] == "[0, two, three], [4, five, six]" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # no number in first position -> error - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("[two, three]") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "[two, three]" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("[two, three]") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[two, three]" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["label"] == "[two, three]" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # correct number of labels - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("[0, null], [4, four]") - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "[0, null], [4, four]" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("[0, null], [4, four]") + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[0, null], [4, four]" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["label"] == "[0, null], [4, four]" gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) assert gui_load.structure["Page 1"]["Question 1"]["label"] == [[0, "null"], [4, "four"]] - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == LabeledSlider.LabeledSlider: + if isinstance(child, LabeledSlider.LabeledSlider): assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]), int(gui_load.structure["Page 1"]["Question 1"]["max"]) + 1)) assert child.levels[0][0] == child.sl.minimum() @@ -277,63 +277,63 @@ def test_labels(gui_load, qtbot): assert child.levels[-1][0] == child.sl.maximum() assert child.levels[-1][1] == "four" QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() # disable labelled with label field filled - gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == False - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == False + gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert not gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert not gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found # assert "label" not in gui_load.structure["Page 1"]["Question 1"].keys() # they stay, they are just not loaded - assert gui_load.structure["Page 1"]["Question 1"]["labelled"] == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=100) + assert not gui_load.structure["Page 1"]["Question 1"]["labelled"] + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: + if isinstance(child, Slider.Slider): assert True - elif type(child) == LabeledSlider.LabeledSlider: + elif isinstance(child, LabeledSlider.LabeledSlider): assert False QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() - gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == True - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == True + gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled() # reset to default - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear() - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "" - gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" + gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["label"] == "" - if gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked(): - gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == False - assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == False + if gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked(): + gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert not gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + assert not gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert "label" not in gui_load.structure["Page 1"]["Question 1"].keys() - assert gui_load.structure["Page 1"]["Question 1"]["labelled"] == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=100) + assert not gui_load.structure["Page 1"]["Question 1"]["labelled"] + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: + if isinstance(child, Slider.Slider): assert True - elif type(child) == LabeledSlider.LabeledSlider: + elif isinstance(child, LabeledSlider.LabeledSlider): assert False QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() gui_load.close() @@ -345,8 +345,8 @@ def test_start(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -354,44 +354,44 @@ def test_start(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) start_pos = find_row_by_label(gui_load.gui.edit_layout, 'start') # try to put a string in -> error - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("zero") - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "zero" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("zero") + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "zero" assert gui_load.structure["Page 1"]["Question 1"]["start"] == "zero" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # greater than max - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("99") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "99" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start"] == "99" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "99" - assert gui_load.structure["Page 1"]["Question 1"]["start"] == "99" + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99" # TODO unschönes Verhalten -> gleich anders anzeigen?! + assert gui_load.structure["Page 1"]["Question 1"]["start"] == int(gui_load.structure["Page 1"]["Question 1"]["max"]) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: + if isinstance(child, Slider.Slider): assert child.value() == int(gui_load.structure["Page 1"]["Question 1"]["max"]) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -400,36 +400,36 @@ def test_start(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '4' # initial value within bounds (min<max<start)->max - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '4' # initial value within bounds (min<max<start)->max + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") # smaller than min - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("-1") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "-1" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start"] == "-1" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "-1" + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1" assert gui_load.structure["Page 1"]["Question 1"]["start"] == int(gui_load.structure["Page 1"]["Question 1"]["min"]) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: + if isinstance(child, Slider.Slider): assert child.value() == int(gui_load.structure["Page 1"]["Question 1"]["min"]) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -438,36 +438,36 @@ def test_start(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"])) # initial value within bounds (start<min<max)->min - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"])) # initial value within bounds (start<min<max)->min + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") # somewhere in between - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("2") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "2" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("2") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start"] == "2" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "2" + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2" assert gui_load.structure["Page 1"]["Question 1"]["start"] == "2" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: + if isinstance(child, Slider.Slider): assert child.value() == 2 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -476,27 +476,109 @@ def test_start(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '2' # initial value within bounds - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '2' # initial value within bounds + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") + + # somewhere in between (negative range) + gui_load.structure["Page 1"]["Question 1"]["min"] = 5 + gui_load.structure["Page 1"]["Question 1"]["max"] = 0 + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("2") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.structure["Page 1"]["Question 1"]["start"] == "2" + gui_load.gui.load_preview() + gui_load.gui.refresh_button.click() + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2" + assert gui_load.structure["Page 1"]["Question 1"]["start"] == "2" + QTimer.singleShot(150, handle_dialog_error) + error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) + assert not error_found + assert not warning_found + + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + test_gui = StackedWindowGui("./test/sltest.txt") + assert test_gui.Stack.count() == 1 + for child in test_gui.Stack.currentWidget().children(): + if isinstance(child, Slider.Slider): + assert child.value() == 2 + + QTimer.singleShot(100, handle_dialog) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) + test_gui.close() + results = [] + with open('./test/results/results_sl.csv', mode='r') as file: + csv_file = csv.reader(file, delimiter=';') + + for lines in csv_file: + results = lines + assert len(results) == 4 + assert results[0] == '1' # participant number + assert results[1] == '2' # initial value within bounds + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp + os.remove("./test/results/results_sl.csv") + + gui_load.structure["Page 1"]["Question 1"]["min"] = -1 + gui_load.structure["Page 1"]["Question 1"]["max"] = -6 + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-2") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-2" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.structure["Page 1"]["Question 1"]["start"] == "-2" + gui_load.gui.load_preview() + gui_load.gui.refresh_button.click() + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-2" + assert gui_load.structure["Page 1"]["Question 1"]["start"] == "-2" + QTimer.singleShot(150, handle_dialog_error) + error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) + assert not error_found + assert not warning_found + + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + test_gui = StackedWindowGui("./test/sltest.txt") + assert test_gui.Stack.count() == 1 + for child in test_gui.Stack.currentWidget().children(): + if isinstance(child, Slider.Slider): + assert child.value() == -2 + + QTimer.singleShot(100, handle_dialog) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) + test_gui.close() + results = [] + with open('./test/results/results_sl.csv', mode='r') as file: + csv_file = csv.reader(file, delimiter=';') + + for lines in csv_file: + results = lines + assert len(results) == 4 + assert results[0] == '1' # participant number + assert results[1] == '-2' # initial value within bounds + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp + os.remove("./test/results/results_sl.csv") + # reset to default - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("0") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() + gui_load.structure["Page 1"]["Question 1"]["min"] = 0 + gui_load.structure["Page 1"]["Question 1"]["max"] = 4 + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["start"] == "0" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0" + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" assert gui_load.structure["Page 1"]["Question 1"]["start"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.close() @@ -507,8 +589,8 @@ def test_step(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -516,69 +598,69 @@ def test_step(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) start_pos = find_row_by_label(gui_load.gui.edit_layout, 'step') # try to put a string in -> error - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("zero") - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "zero" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("zero") + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "zero" assert gui_load.structure["Page 1"]["Question 1"]["step"] == "zero" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # greater than max+min -> error - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("10") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "10" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "10" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("10") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "10" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "10" assert gui_load.structure["Page 1"]["Question 1"]["step"] == "10" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # 0 -> error - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("0") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" assert gui_load.structure["Page 1"]["Question 1"]["step"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # greater than 1 gui_load.structure["Page 1"]["Question 1"]["max"] = "5" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("2") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "2" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("2") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["step"] == "2" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "2" + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2" assert gui_load.structure["Page 1"]["Question 1"]["step"] == "2" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 - for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: - print(child.tickInterval()) # TODO is it possible to count the displayed ticks/steps? + #for child in test_gui.Stack.currentWidget().children(): + # if isinstance(child, Slider.Slider): + # print(child.tickInterval()) # TODO is it possible to count the displayed ticks/steps? QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -587,37 +669,37 @@ def test_step(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '0' # initial value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '0' # initial value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") # smaller than 1 gui_load.structure["Page 1"]["Question 1"]["max"] = "4" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("0.5") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0.5" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0.5") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0.5" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["step"] == "0.5" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0.5" + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0.5" assert gui_load.structure["Page 1"]["Question 1"]["step"] == '0.5' QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 - for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: - print(child.tickInterval()) # TODO is it possible to count the displayed ticks/steps? + #for child in test_gui.Stack.currentWidget().children(): + # if isinstance(child, Slider.Slider): + # print(child.tickInterval()) # TODO is it possible to count the displayed ticks/steps? QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -626,27 +708,27 @@ def test_step(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '0.0' # initial value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '0.0' # initial value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") # reset to default - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("1") - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "1" - gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("1") + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" + gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["step"] == "1" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "1" + assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1" assert gui_load.structure["Page 1"]["Question 1"]["step"] == "1" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.close() @@ -657,8 +739,8 @@ def test_min(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -666,58 +748,59 @@ def test_min(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) min_pos = find_row_by_label(gui_load.gui.edit_layout, 'min') # try to put a string in -> error - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().insert("zero") - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "zero" + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().insert("zero") + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "zero" assert gui_load.structure["Page 1"]["Question 1"]["min"] == "zero" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # min = max -> error - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().insert("4") - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "4" + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().insert("4") + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "4" assert gui_load.structure["Page 1"]["Question 1"]["min"] == "4" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # greater than max - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().insert("9") - assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "9" - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().insert("9") + assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "9" + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["min"] == "9" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "9" + assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "9" assert gui_load.structure["Page 1"]["Question 1"]["min"] == "9" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: - assert child.minimum() == 0 + if isinstance(child, Slider.Slider): + assert child.minimum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"])) assert child._min == int(gui_load.structure["Page 1"]["Question 1"]["min"]) - assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"])-int(gui_load.structure["Page 1"]["Question 1"]["min"]))/int(gui_load.structure["Page 1"]["Question 1"]["step"])) if int(gui_load.structure["Page 1"]["Question 1"]["max"]) > int(gui_load.structure["Page 1"]["Question 1"]["min"]) else -1*int((int(gui_load.structure["Page 1"]["Question 1"]["max"])-int(gui_load.structure["Page 1"]["Question 1"]["min"]))/int(gui_load.structure["Page 1"]["Question 1"]["step"])) + assert child.maximum() == 0 assert child._max == int(gui_load.structure["Page 1"]["Question 1"]["max"]) + assert child.value() == gui_load.structure["Page 1"]["Question 1"]["start"] QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -726,42 +809,35 @@ def test_min(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '4' # initial value < max < min -> max - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '4' # initial value < max < min -> max + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") # with labels cb_pos = find_row_by_label(gui_load.gui.edit_layout, 'labelled') - gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=100) + gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == LabeledSlider.LabeledSlider: + if isinstance(child, LabeledSlider.LabeledSlider): assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]), int(gui_load.structure["Page 1"]["Question 1"]["max"]) - 1, -1)) - assert child.levels[0][0] == child.sl.minimum() + assert child.levels[0][0] == child.sl.maximum() assert child.levels[0][1] == gui_load.structure["Page 1"]["Question 1"]["min"] - assert child.levels[-1][0] == child.sl.maximum() + assert child.levels[-1][0] == child.sl.maximum() - child.sl.minimum() assert child.levels[-1][1] == gui_load.structure["Page 1"]["Question 1"]["max"] - assert child.sl.minimum() == 0 + assert child.sl.minimum() == int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"]) assert child.sl._min == int(gui_load.structure["Page 1"]["Question 1"]["min"]) - assert child.sl.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) if int( - gui_load.structure["Page 1"]["Question 1"]["max"]) > int( - gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int( - gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) + assert child.sl.maximum() == 0 assert child.sl._max == int(gui_load.structure["Page 1"]["Question 1"]["max"]) - elif type(child) == Slider.Slider: + elif isinstance(child, Slider.Slider): assert False QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -770,47 +846,40 @@ def test_min(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '4' # initial value < max < min -> max - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '4' # initial value < max < min -> max + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") - gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == False + gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert not gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() # reset to default (min < max) - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().insert("0") - assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "0" - gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0") + assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["min"] == "0" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "0" + assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" assert gui_load.structure["Page 1"]["Question 1"]["min"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: + if isinstance(child, Slider.Slider): assert child.minimum() == 0 assert child._min == int(gui_load.structure["Page 1"]["Question 1"]["min"]) - assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) if int( - gui_load.structure["Page 1"]["Question 1"]["max"]) > int( - gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int( - gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) + assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"])) if int(gui_load.structure["Page 1"]["Question 1"]["max"]) > int(gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"])) assert child._max == int(gui_load.structure["Page 1"]["Question 1"]["max"]) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -819,10 +888,10 @@ def test_min(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"])) # initial value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"])) # initial value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") # initial value @@ -838,8 +907,8 @@ def test_max(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -847,65 +916,59 @@ def test_max(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) max_pos = find_row_by_label(gui_load.gui.edit_layout, 'max') # try to put a string in -> error - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().insert("zero") - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "zero" + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().insert("zero") + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "zero" assert gui_load.structure["Page 1"]["Question 1"]["max"] == "zero" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # min = max -> error - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().insert("0") - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "0" + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0") + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0" assert gui_load.structure["Page 1"]["Question 1"]["max"] == "0" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == True - assert warning_found == False + assert error_found + assert not warning_found # smaller than min - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().insert("-5") - assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "-5" - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-5") + assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-5" + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["max"] == "-5" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "-5" + assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-5" assert gui_load.structure["Page 1"]["Question 1"]["max"] == "-5" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: - assert child.minimum() == 0 + if isinstance(child, Slider.Slider): + assert child.invertedAppearance() + assert child.minimum() == -5 assert child._min == int(gui_load.structure["Page 1"]["Question 1"]["min"]) - assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) if int( - gui_load.structure["Page 1"]["Question 1"]["max"]) > int( - gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int( - gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) + assert child.maximum() == 0 assert child._max == int(gui_load.structure["Page 1"]["Question 1"]["max"]) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -914,42 +977,35 @@ def test_max(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"])) # initial value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == str(gui_load.structure["Page 1"]["Question 1"]["start"]) # initial value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") # with labels cb_pos = find_row_by_label(gui_load.gui.edit_layout, 'labelled') - gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=100) + gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == LabeledSlider.LabeledSlider: + if isinstance(child, LabeledSlider.LabeledSlider): assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]), int(gui_load.structure["Page 1"]["Question 1"]["max"]) - 1, -1)) - assert child.levels[0][0] == child.sl.minimum() + assert child.levels[0][0] == child.sl.maximum() assert child.levels[0][1] == gui_load.structure["Page 1"]["Question 1"]["min"] - assert child.levels[-1][0] == child.sl.maximum() + assert child.levels[-1][0] == child.sl.maximum() - child.sl.minimum() assert child.levels[-1][1] == gui_load.structure["Page 1"]["Question 1"]["max"] - assert child.sl.minimum() == 0 + assert child.sl.minimum() == -5 assert child.sl._min == int(gui_load.structure["Page 1"]["Question 1"]["min"]) - assert child.sl.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) if int( - gui_load.structure["Page 1"]["Question 1"]["max"]) > int( - gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int( - gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) + assert child.sl.maximum() == 0 assert child.sl._max == int(gui_load.structure["Page 1"]["Question 1"]["max"]) - elif type(child) == Slider.Slider: + elif isinstance(child, Slider.Slider): assert False QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -958,47 +1014,40 @@ def test_max(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"])) # initial value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == str(gui_load.structure["Page 1"]["Question 1"]["start"]) # initial value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") - gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == False + gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert not gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() # reset to default (min < max) - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().insert("4") - assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "4" - gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().insert("4") + assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "4" + gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["max"] == "4" gui_load.gui.load_preview() gui_load.gui.refresh_button.click() - assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "4" + assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "4" assert gui_load.structure["Page 1"]["Question 1"]["max"] == "4" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == Slider.Slider: + if isinstance(child, Slider.Slider): assert child.minimum() == 0 assert child._min == int(gui_load.structure["Page 1"]["Question 1"]["min"]) - assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) if int( - gui_load.structure["Page 1"]["Question 1"]["max"]) > int( - gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int( - gui_load.structure["Page 1"]["Question 1"]["max"]) - int( - gui_load.structure["Page 1"]["Question 1"]["min"])) / int( - gui_load.structure["Page 1"]["Question 1"]["step"])) + assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"])) if int(gui_load.structure["Page 1"]["Question 1"]["max"]) > int(gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"])) assert child._max == int(gui_load.structure["Page 1"]["Question 1"]["max"]) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -1006,10 +1055,10 @@ def test_max(gui_load, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"])) # initial value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"])) # initial value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") gui_load.structure["Page 1"]["Question 1"]["start"] = 0 @@ -1024,8 +1073,8 @@ def test_text_position(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -1033,50 +1082,50 @@ def test_text_position(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) qa_pos = find_row_by_label(gui_load.gui.edit_layout, 'question_above') - assert gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().isChecked() == False + assert not gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == QFormLayout: + if isinstance(child, QFormLayout): assert child.rowCount() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() os.remove("./test/results/results_sl.csv") # change position to above - gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().isChecked() == True + gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False - assert gui_load.structure["Page 1"]["Question 1"]["question_above"] == True - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + assert gui_load.structure["Page 1"]["Question 1"]["question_above"] + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == QFormLayout: + if isinstance(child, QFormLayout): assert child.rowCount() == 2 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() os.remove("./test/results/results_sl.csv") # revert to original - gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().click() - assert gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().isChecked() == False + gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().click() + assert not gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked() QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False - assert gui_load.structure["Page 1"]["Question 1"]["question_above"] == False - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + assert not error_found + assert not warning_found + assert not gui_load.structure["Page 1"]["Question 1"]["question_above"] + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.close() @@ -1087,8 +1136,8 @@ def test_header(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -1096,55 +1145,55 @@ def test_header(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) header_pos = find_row_by_label(gui_load.gui.edit_layout, 'header') - assert gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().text() == '' + assert gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().text() == '' test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == QFormLayout: + if isinstance(child, QFormLayout): assert child.rowCount() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() os.remove("./test/results/results_sl.csv") # add header - gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().clear() - assert gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().text() == '' - gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().setPlainText('one, "", "", "", four') - gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().text() == 'one, "", "", "", four' + gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + assert gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().text() == '' + gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText('one, "", "", "", four') + gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().text() == 'one, "", "", "", four' gui_load.structure = listify(gui_load.structure) QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert gui_load.structure["Page 1"]["Question 1"]["header"] == ['one', "", "", "", 'four'] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/sltest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) == QFormLayout: + if isinstance(child, QFormLayout): assert child.rowCount() == 2 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) test_gui.close() os.remove("./test/results/results_sl.csv") # revert to original - gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().text() == '' + gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().text() == '' QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) gui_load.structure = listify(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found assert "header" not in gui_load.structure["Page 1"]["Question 1"].keys() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.close() @@ -1155,7 +1204,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -1164,15 +1213,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'sl' # first row - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'sl' # first row + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '0' # initial value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '0' # initial value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") @@ -1181,11 +1230,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_sl.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -1193,15 +1242,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'sl' # first row - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'sl' # first row + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '0' # initial value - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '0' # initial value + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) @@ -1211,13 +1260,13 @@ def test_execute_questionnaire(run, qtbot): os.remove("./test/results/results_sl.csv") assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == Slider.Slider: + if isinstance(child, Slider.Slider): bb = child.rect() - QTest.mouseClick(child, Qt.LeftButton, pos=bb.center()) - assert child.value() == int((child._max+child._min)/2) + QTest.mouseClick(child, Qt.MouseButton.LeftButton, pos=bb.center()) + assert child.value() == int((child._max + child._min) / 2) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000) results = [] with open('./test/results/results_sl.csv', mode='r') as file: @@ -1226,10 +1275,10 @@ def test_execute_questionnaire(run, qtbot): for lines in csv_file: results = lines assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '2' # middle of 0 and 4 is 2 - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '2' # middle of 0 and 4 is 2 + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_sl.csv") @@ -1238,16 +1287,16 @@ def test_execute_questionnaire_blocked(run, qtbot): with mock_file(r'./test/results/results_sl.csv'): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == Slider.Slider: + if isinstance(child, Slider.Slider): bb = child.rect() - QTest.mouseClick(child, Qt.LeftButton, pos=bb.center()) + QTest.mouseClick(child, Qt.MouseButton.LeftButton, pos=bb.center()) assert child.value() == int((child._max + child._min) / 2) QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -1255,13 +1304,13 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'sl' # first row - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'sl' # first row + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '2' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '2' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) diff --git a/test/Treeview_Test.py b/test/Treeview_Test.py index 8786d92064a57e1b4a15777d9c7e325c24315e70..22e6def59527c9089c2eda3072e013ffe76df243 100644 --- a/test/Treeview_Test.py +++ b/test/Treeview_Test.py @@ -2,7 +2,7 @@ Ref how to auto-dialog: https://stackoverflow.com/a/59148220 """ -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, QTest, handle_dialog_p, handle_dialog_q, Qt, default_values, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_sa @pytest.fixture @@ -28,11 +28,11 @@ def test_create(gui_init, qtbot): # noinspection PyArgumentList def test_add_page(gui_init, qtbot): tv = gui_init.gui.treeview - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -69,18 +69,18 @@ def test_load_file(gui_init, qtbot): # noinspection PyArgumentList def test_add_page_add_question(gui_init, qtbot): - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -97,11 +97,11 @@ def test_add_question_after_load(gui_init, qtbot): gui_init.load_file() tv = gui_init.gui.treeview tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "onepage.txt" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -118,12 +118,12 @@ def test_add_page_after_load(gui_init, qtbot): gui_init.load_file() tv = gui_init.gui.treeview tv.setCurrentItem(tv.topLevelItem(0)) - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) QTimer.singleShot(200, handle_dialog_sa) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "onepage.txt" assert tv.topLevelItemCount() == 1 diff --git a/test/cbtest.txt b/test/cbtest.txt index f995c58f46c3465b5fd5d439716e707d03f8eec5..25718f38658fd45be2925838972114bc173a6111 100644 --- a/test/cbtest.txt +++ b/test/cbtest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/context.py b/test/context.py index 4690a31e07924029620be5cd11717653e6c89016..bbc440124cb787501f7a6c39d9d226f21d4944a0 100644 --- a/test/context.py +++ b/test/context.py @@ -10,9 +10,9 @@ import keyboard from MockReceiver import MockReceiver import portalocker from pythonosc import osc_server, dispatcher -from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator -from PyQt5.QtCore import QTimer, QPoint -from PyQt5.QtWidgets import QCheckBox, QLabel, QRadioButton, QFormLayout, QButtonGroup, QPlainTextEdit +from PySide6.QtGui import QIntValidator, QDoubleValidator, QRegularExpressionValidator, QPalette +from PySide6.QtCore import QTimer, QPoint +from PySide6.QtWidgets import QCheckBox, QLabel, QRadioButton, QFormLayout, QButtonGroup, QPlainTextEdit import asyncio diff --git a/test/hline_test.py b/test/hline_test.py index cc2480178d8a953701e669b6a4ba9e947fcb7f93..c90c188ca85eba8e8337b4cefb3839c241a97ac1 100644 --- a/test/hline_test.py +++ b/test/hline_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of Plain text + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, ConfigObj, QHLine, QCheckBox, QLineEdit, page_fields, listify, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, handle_dialog, csv, re, os, mock_file @pytest.fixture @@ -27,19 +27,19 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -56,19 +56,19 @@ def test_create(gui_init, qtbot): layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["HLine"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["HLine"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["HLine"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["HLine"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["HLine"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["HLine"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["HLine"][0].keys()) assert len(gui_init.undo_stack) == 2 # 2 for creating page & question @@ -83,7 +83,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "HLine"} for key, value in default_values.items(): - if key in fields_per_type["Plain Text"][0].keys(): + if key in fields_per_type["Plain Text"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -115,12 +115,12 @@ def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 line_cnt = 0 for child in run.Stack.currentWidget().children(): - if type(child) == QHLine: + if isinstance(child, QHLine): line_cnt += 1 assert line_cnt == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_hl.csv', mode='r') as file: @@ -129,13 +129,13 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'Start' - assert lines[2] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'Start' + assert results[2] == 'End' assert len(results) == 3 - assert lines[0] == '1' # participant number - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp os.remove("./test/results/results_hl.csv") @@ -144,11 +144,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_hl.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -156,11 +156,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'Start' - assert lines[2] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'Start' + assert results[2] == 'End' assert len(results) == 3 - assert lines[0] == '-1' # participant number unknown - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp + assert results[0] == '-1' # participant number unknown + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp os.remove(res_file) diff --git a/test/imgtest.txt b/test/imgtest.txt index 8a6b6206c244249ff04b5566c47cb94753b270c4..ec06d1b68964acf3292001cd7636587148ae2655 100644 --- a/test/imgtest.txt +++ b/test/imgtest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/listify_test.py b/test/listify_test.py index cfd2fcb1730a7f72dfd1f98a5276bbc1f83aca10..49443e54ff770c11262988ff85ba11d8aafa6b7a 100644 --- a/test/listify_test.py +++ b/test/listify_test.py @@ -1,6 +1,6 @@ """Test if the listify function in Validator.py is working correctly.""" -from context import * +from context import listify, ConfigObj # fields: "answers", "button_texts", "header", "label", "questions" @@ -116,7 +116,7 @@ def test_list_as_list_of_strings(): assert structure['Page 1']['Question 1']['answers'] == ['answer1', 'answer2'] assert structure['Page 1']['Question 1']['button_texts'] == ['button1', 'button2'] assert structure['Page 1']['Question 1']['header'] == ['head1', 'head2'] - assert structure['Page 1']['Question 1']['label'] == [[1.0, 'label2']] # sublist pairs with number as 0st entry + assert structure['Page 1']['Question 1']['label'] == [[1.0, 'label2']] # sublist pairs with number as 0th entry assert structure['Page 1']['Question 1']['questions'] == ['quest1', 'quest2'] diff --git a/test/mrtest.txt b/test/mrtest.txt index bb08300c899a6013cbab0ecdf3babdfc6bba3e4f..ac497084986c394fe9028e617836979b6f3a1ba3 100644 --- a/test/mrtest.txt +++ b/test/mrtest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/osctest.txt b/test/osctest.txt index df6d91dcbd86b4db35b43e87113078c33ae2ea92..6bcc5e972f7a0ee0de8cf2e0de37ebeafaaf989d 100644 --- a/test/osctest.txt +++ b/test/osctest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. audio_ip = 127.0.0.1 audio_port = 8000 video_ip = 127.0.0.1 diff --git a/test/password_test.py b/test/password_test.py index 6bcd4189a86350af6baf1511d7a04f834024e42d..7b196e245ce5ca2f66b408a4e8bff6ae3294b244 100644 --- a/test/password_test.py +++ b/test/password_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of PasswordEntry.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, PasswordEntry, QHBoxLayout, keyboard, QIntValidator, QDoubleValidator, QRegularExpressionValidator, QPalette, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file @pytest.fixture @@ -27,19 +27,19 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) # .setSelected(True) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -52,40 +52,40 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Password" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Password"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Password"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["Password"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Password"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Password"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["Password"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1)) == QHBoxLayout and \ - gui_init.gui.pw_layout == layout.itemAt(row, 1): + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout) and \ + gui_init.gui.pw_layout == layout.itemAt(row, QFormLayout.ItemRole.FieldRole): not_none_rows += 1 - assert layout.itemAt(row, 1).itemAt(1).widget().text() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().text() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["Password"][0].keys()) assert len(gui_init.undo_stack) == 11 # 2 for creating page & question, 9 for choosing Password @@ -100,7 +100,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Password"} for key, value in default_values.items(): - if key in fields_per_type["Password"][0].keys(): + if key in fields_per_type["Password"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -134,13 +134,13 @@ def test_password_file(gui_load, run, qtbot): assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) pw_str = find_row_by_label(gui_load.gui.edit_layout, 'password_file') - pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], 1).itemAt(pw_str[1]).widget().text() + pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], QFormLayout.ItemRole.FieldRole).itemAt(pw_str[1]).widget().text() with open(pwfile) as f: passwords = f.read().splitlines() for child in run.Stack.currentWidget().children(): - if type(child) == PasswordEntry: + if isinstance(child, PasswordEntry): assert child.passwords == passwords def handle_file_chooser(): @@ -148,11 +148,11 @@ def test_password_file(gui_load, run, qtbot): keyboard.write("mock_pws_int.txt") keyboard.press("enter") - pw_btn = gui_load.gui.edit_layout.itemAt(find_row_by_label(gui_load.gui.edit_layout, 'password_file_btn')[0], 1).itemAt(0).widget() + pw_btn = gui_load.gui.edit_layout.itemAt(find_row_by_label(gui_load.gui.edit_layout, 'password_file_btn')[0], QFormLayout.ItemRole.FieldRole).itemAt(0).widget() QTimer.singleShot(100, handle_file_chooser) QTest.mouseClick(pw_btn, Qt.MouseButton.LeftButton) - pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], 1).itemAt(pw_str[1]).widget().text() + pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], QFormLayout.ItemRole.FieldRole).itemAt(pw_str[1]).widget().text() assert pwfile.endswith("mock_pws_int.txt") with open(pwfile) as f: passwords = f.read().splitlines() @@ -165,8 +165,8 @@ def test_password_file(gui_load, run, qtbot): def test_policy(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -174,109 +174,118 @@ def test_policy(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) pw_str = find_row_by_label(gui_load.gui.edit_layout, 'password_file') - pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], 1).itemAt(pw_str[1]).widget() + pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], QFormLayout.ItemRole.FieldRole).itemAt(pw_str[1]).widget() answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'policy') - policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget() + policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget() assert policy_cb.currentText() == 'None' assert find_row_by_label(gui_load.gui.edit_layout, "min") is None assert find_row_by_label(gui_load.gui.edit_layout, "max") is None assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/pwtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == PasswordEntry: + if isinstance(child, PasswordEntry): assert child.validator() is None test_gui.close() - QTest.mouseClick(policy_cb, Qt.LeftButton) - QTest.keyClick(policy_cb, Qt.Key_Down) - QTest.keyClick(policy_cb, Qt.Key_Enter) + QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000) assert policy_cb.currentText() == "int" - assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos+1, 1) - assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos+1, 3) + policy_cb.clearFocus() + gui_load.gui.setFocus() + assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1) + assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3) assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None min_b = find_row_by_label(gui_load.gui.edit_layout, "min") - QTest.keyClicks(gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget(), '1000') - gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget().text() == '1000' + QTest.keyClicks(gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget(), '1000') + gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget().text() == '1000' max_b = find_row_by_label(gui_load.gui.edit_layout, "max") - QTest.keyClicks(gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget(), '9999') - gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget().text() == '9999' + QTest.keyClicks(gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget(), '9999') + gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget().text() == '9999' gui_load.structure["Page 1"]["Question 1"]["password_file"] = "./test/mock_pws_int.txt" pwfile.setText("./test/mock_pws_int.txt") gui_load.gui.refresh_button.click() + QTest.qWait(2000) assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['int', '1000', '9999'] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + gui_load.save() # have to enforce save since focus is lost somwhow.... + QTest.qWait(1000) test_gui = StackedWindowGui("./test/pwtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == PasswordEntry: - assert type(child.validator()) == QIntValidator + if isinstance(child, PasswordEntry): + assert isinstance(child.validator(), QIntValidator) test_gui.close() - QTest.mouseClick(policy_cb, Qt.LeftButton) - QTest.keyClick(policy_cb, Qt.Key_Down) - QTest.keyClick(policy_cb, Qt.Key_Enter) + QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000) assert policy_cb.currentText() == "double" - assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos+1, 1) - assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos+1, 3) - assert find_row_by_label(gui_load.gui.edit_layout, "dec") == (answers_pos+1, 5) + assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1) + assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3) + assert find_row_by_label(gui_load.gui.edit_layout, "dec") == (answers_pos + 1, 5) assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None min_b = find_row_by_label(gui_load.gui.edit_layout, "min") - QTest.keyClicks(gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget(), '1') - gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget().text() == '1' + QTest.keyClicks(gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget(), '1') + gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget().text() == '1' max_b = find_row_by_label(gui_load.gui.edit_layout, "max") - QTest.keyClicks(gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget(), '100') - gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget().text() == '100' + QTest.keyClicks(gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget(), '100') + gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget().text() == '100' dec_b = find_row_by_label(gui_load.gui.edit_layout, "dec") - QTest.keyClicks(gui_load.gui.edit_layout.itemAt(dec_b[0], 1).itemAt(dec_b[1]).widget(), '2') - gui_load.gui.edit_layout.itemAt(dec_b[0], 1).itemAt(dec_b[1]).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(dec_b[0], 1).itemAt(dec_b[1]).widget().text() == '2' + QTest.keyClicks(gui_load.gui.edit_layout.itemAt(dec_b[0], QFormLayout.ItemRole.FieldRole).itemAt(dec_b[1]).widget(), '2') + gui_load.gui.edit_layout.itemAt(dec_b[0], QFormLayout.ItemRole.FieldRole).itemAt(dec_b[1]).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(dec_b[0], QFormLayout.ItemRole.FieldRole).itemAt(dec_b[1]).widget().text() == '2' gui_load.structure["Page 1"]["Question 1"]["password_file"] = "./test/mock_pws_double.txt" pwfile.setText("./test/mock_pws_double.txt") gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['double', '1', '100', '2'] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + gui_load.save() # have to enforce save since focus is lost somwhow.... + QTest.qWait(1000) test_gui = StackedWindowGui("./test/pwtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == PasswordEntry: - assert type(child.validator()) == QDoubleValidator + if isinstance(child, PasswordEntry): + assert isinstance(child.validator(), QDoubleValidator) test_gui.close() - QTest.mouseClick(policy_cb, Qt.LeftButton) - QTest.keyClick(policy_cb, Qt.Key_Down) - QTest.keyClick(policy_cb, Qt.Key_Enter) + QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000) assert policy_cb.currentText() == "regex" assert find_row_by_label(gui_load.gui.edit_layout, "min") is None assert find_row_by_label(gui_load.gui.edit_layout, "max") is None assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None assert find_row_by_label(gui_load.gui.edit_layout, "exp") == (answers_pos + 1, 1) exp_b = find_row_by_label(gui_load.gui.edit_layout, "exp") - QTest.keyClicks(gui_load.gui.edit_layout.itemAt(exp_b[0], 1).itemAt(exp_b[1]).widget(), '[A-Z]\\d') - gui_load.gui.edit_layout.itemAt(exp_b[0], 1).itemAt(exp_b[1]).widget().editingFinished.emit() - assert gui_load.gui.edit_layout.itemAt(exp_b[0], 1).itemAt(exp_b[1]).widget().text() == '[A-Z]\\d' + QTest.keyClicks(gui_load.gui.edit_layout.itemAt(exp_b[0], QFormLayout.ItemRole.FieldRole).itemAt(exp_b[1]).widget(), '[A-Z]\\d') + gui_load.gui.edit_layout.itemAt(exp_b[0], QFormLayout.ItemRole.FieldRole).itemAt(exp_b[1]).widget().editingFinished.emit() + assert gui_load.gui.edit_layout.itemAt(exp_b[0], QFormLayout.ItemRole.FieldRole).itemAt(exp_b[1]).widget().text() == '[A-Z]\\d' gui_load.structure["Page 1"]["Question 1"]["password_file"] = "./test/mock_pws_regex.txt" pwfile.setText("./test/mock_pws_regex.txt") gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['regex', '[A-Z]\\d'] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + gui_load.save() # have to enforce save since focus is lost somwhow.... + QTest.qWait(2000) test_gui = StackedWindowGui("./test/pwtest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == PasswordEntry: - assert type(child.validator()) == QRegExpValidator + if isinstance(child, PasswordEntry): + assert isinstance(child.validator(), QRegularExpressionValidator) test_gui.close() - QTest.mouseClick(policy_cb, Qt.LeftButton) - QTest.keyClick(policy_cb, Qt.Key_Up) - QTest.keyClick(policy_cb, Qt.Key_Up) - QTest.keyClick(policy_cb, Qt.Key_Up) - QTest.keyClick(policy_cb, Qt.Key_Enter) + QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Up) + QTest.keyClick(policy_cb, Qt.Key.Key_Up) + QTest.keyClick(policy_cb, Qt.Key.Key_Up) + QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000) assert policy_cb.currentText() == 'None' assert find_row_by_label(gui_load.gui.edit_layout, "min") is None assert find_row_by_label(gui_load.gui.edit_layout, "max") is None @@ -284,7 +293,8 @@ def test_policy(gui_load, qtbot): assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None gui_load.structure["Page 1"]["Question 1"]["password_file"] = "./test/mock_pws.txt" pwfile.setText("./test/mock_pws.txt") - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + gui_load.save() # have to enforce save since focus is lost somwhow.... gui_load.close() @@ -295,7 +305,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_pw.csv', mode='r') as file: @@ -304,15 +314,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pw' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pw' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pw.csv") @@ -321,11 +331,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_pw.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -333,15 +343,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pw' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pw' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) @@ -351,23 +361,23 @@ def test_execute_questionnaire_type_pw(run, qtbot): os.remove("./test/results/results_pw.csv") assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) is PasswordEntry: + if isinstance(child, PasswordEntry): assert child.text() == '' - QTest.keyClicks(child, "wrong", modifier=Qt.NoModifier, delay=1) + QTest.keyClicks(child, "wrong", modifier=Qt.KeyboardModifier.NoModifier, delay=500) assert child.text() == 'wrong' - assert child.validate() == False + assert not child.validate() assert child.toolTip() == "Invalid password." assert child.objectName() == 'required' - # assert child.palette().color(6).name() == 'red' + # assert child.palette().color(QPalette.Text).name() == 'red' child.clear() - QTest.keyClicks(child, "password", modifier=Qt.NoModifier, delay=1) + QTest.keyClicks(child, "password", modifier=Qt.KeyboardModifier.NoModifier, delay=500) assert child.text() == 'password' - assert child.validate() == True + assert child.validate() assert child.toolTip() == "" assert child.objectName() == '' QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_pw.csv', mode='r') as file: @@ -376,15 +386,15 @@ def test_execute_questionnaire_type_pw(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pw' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pw' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == 'password' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'password' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pw.csv") @@ -393,26 +403,26 @@ def test_execute_questionnaire_blocked(run, qtbot): with mock_file(r'./test/results/results_pw.csv'): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) is PasswordEntry: + if isinstance(child, PasswordEntry): assert child.text() == '' - QTest.keyClicks(child, "wrong", modifier=Qt.NoModifier, delay=1) + QTest.keyClicks(child, "wrong", modifier=Qt.KeyboardModifier.NoModifier, delay=500) assert child.text() == 'wrong' - assert child.validate() == False + assert not child.validate() assert child.toolTip() == "Invalid password." assert child.objectName() == 'required' - # assert child.palette().color(6).name() == 'red' + # assert child.palette().color(QPalette.Text).name() == 'red' child.clear() - QTest.keyClicks(child, "password", modifier=Qt.NoModifier, delay=1) + QTest.keyClicks(child, "password", modifier=Qt.KeyboardModifier.NoModifier, delay=500) assert child.text() == 'password' - assert child.validate() == True + assert child.validate() assert child.toolTip() == "" assert child.objectName() == '' QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -420,15 +430,15 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pw' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pw' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == 'password' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == 'password' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) @@ -438,26 +448,26 @@ def test_execute_questionnaire_type_wrong_pw(run, qtbot): os.remove("./test/results/results_pw.csv") assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) is PasswordEntry: + if isinstance(child, PasswordEntry): assert child.text() == '' - QTest.keyClicks(child, "wrong", modifier=Qt.NoModifier, delay=1) + QTest.keyClicks(child, "wrong", modifier=Qt.KeyboardModifier.NoModifier, delay=500) assert child.text() == 'wrong' - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) for child in run.Stack.currentWidget().children(): - if type(child) is PasswordEntry: + if isinstance(child, PasswordEntry): assert child.text() == 'wrong' assert child.toolTip() == "Invalid password." assert child.objectName() == 'required' - assert child.palette().color(6).name() == '#ff0000' # == red + assert child.palette().color(QPalette.Text).name() == '#ff0000' # == red child.clear() - QTest.keyClicks(child, "password", modifier=Qt.NoModifier, delay=1) + QTest.keyClicks(child, "password", modifier=Qt.KeyboardModifier.NoModifier, delay=500) assert child.text() == 'password' - assert child.validate() == True + assert child.validate() assert child.toolTip() == "" assert child.objectName() == '' QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_pw.csv', mode='r') as file: @@ -466,13 +476,13 @@ def test_execute_questionnaire_type_wrong_pw(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'pw' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'pw' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == 'password' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'password' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_pw.csv") diff --git a/test/pbtest.txt b/test/pbtest.txt index 595ade74e1974bf7b30eacf5c6c73fd44b4b5f33..5bbb8e04444bf5ae563711518ac254928b38476b 100644 --- a/test/pbtest.txt +++ b/test/pbtest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. pupil_ip = 127.0.0.1 go_back = True back_text = Zurück diff --git a/test/pbtest2.txt b/test/pbtest2.txt index 78953da1a50e9cd66bb66428d25f48209962b1d2..54f650d648562ade2e9b9e2196b434052463b64d 100644 --- a/test/pbtest2.txt +++ b/test/pbtest2.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. pupil_ip = 127.0.0.1 go_back = True back_text = Zurück diff --git a/test/plain_text_test.py b/test/plain_text_test.py index 91179cd633d451503f5c01d8b06ac0d975a35c05..8cd6ea6d016c6714ba1b3d698453fdf1e7e50d5e 100644 --- a/test/plain_text_test.py +++ b/test/plain_text_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of Plain text + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, QLabel, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file @pytest.fixture @@ -27,19 +27,19 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) # .setSelected(True) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -52,34 +52,34 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Plain Text" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Plain Text"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Plain Text"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["Plain Text"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Plain Text"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Plain Text"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["Plain Text"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["Plain Text"][0].keys()) assert len(gui_init.undo_stack) == 10 # 2 for creating page & question, 8 for choosing Plain Text @@ -94,7 +94,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Plain Text"} for key, value in default_values.items(): - if key in fields_per_type["Plain Text"][0].keys(): + if key in fields_per_type["Plain Text"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -124,8 +124,8 @@ def test_create(gui_init, qtbot): def test_text(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -133,28 +133,28 @@ def test_text(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'text') - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("Some text.") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "Some text." - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("Some text.") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Some text." + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["text"] == "Some text." QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear() - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("") - assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "" - gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear() + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("") + assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "" + gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit() assert gui_load.structure["Page 1"]["Question 1"]["text"] == "" QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == True + assert not error_found + assert warning_found QTimer.singleShot(150, handle_dialog_no_save) gui_load.close() @@ -163,11 +163,11 @@ def test_text(gui_load, qtbot): def test_execute_questionnaire_no_interaction(run, qtbot): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) == QLabel: + if isinstance(child, QLabel): assert child.text() == "This is a test.\nDoes it work?" QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_pt.csv', mode='r') as file: @@ -176,13 +176,13 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'Start' - assert lines[2] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'Start' + assert results[2] == 'End' assert len(results) == 3 - assert lines[0] == '1' # participant number - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp + assert results[0] == '1' # participant number + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp os.remove("./test/results/results_pt.csv") @@ -191,11 +191,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_pt.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -203,11 +203,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'Start' - assert lines[2] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'Start' + assert results[2] == 'End' assert len(results) == 3 - assert lines[0] == '-1' # participant number unknown - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp + assert results[0] == '-1' # participant number unknown + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp os.remove(res_file) diff --git a/test/pltest.txt b/test/pltest.txt index 1b9bd53c44972fe983bc7640c83ff011b3bdaecb..2411e21c9383ef59cc698365bc8c6c322a4de75a 100644 --- a/test/pltest.txt +++ b/test/pltest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/pltest2.txt b/test/pltest2.txt index 200e51c5b9677d672e301b655e521a46016f02b0..82fa713a7c8663ca9e0330918b3a741dedc34dde 100644 --- a/test/pltest2.txt +++ b/test/pltest2.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/pwtest.txt b/test/pwtest.txt index 254e778098c82099ce0c75bf676eecc78b9172bf..92e5e0472b949de6f75b06fa0d6787cc0bbccf2a 100644 --- a/test/pwtest.txt +++ b/test/pwtest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/pytest.ini b/test/pytest.ini index e7fa301c9cbd8e5cc72cbb044924b473b683e512..b127307aced9ff932c84fd78649a801c793daed6 100644 --- a/test/pytest.ini +++ b/test/pytest.ini @@ -1,4 +1,4 @@ [pytest] -qt_api=pyqt5 +qt_api=pyside6 markers = pupil: marks tests as requiring Pupil Capture to be open (deselect with '-m "not pupil"') \ No newline at end of file diff --git a/test/rbtest.txt b/test/rbtest.txt index b11edfe5e0b75079ac09d229a179e081b8013431..dd6f74aa1e3120344363661f703dac8bdb1f9c72 100644 --- a/test/rbtest.txt +++ b/test/rbtest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/rm_two_pages.txt b/test/rm_two_pages.txt index c656dac96c071c9096d4870e445ef8a9f6369ea6..696b8da3e52679ec9471b148dd7934376dbc21d2 100644 --- a/test/rm_two_pages.txt +++ b/test/rm_two_pages.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/rmtest.txt b/test/rmtest.txt index fe1dbd87023ab2eee6412da689efd78bca171075..0de5dd1943145f685bd173e28bfc295e5735fed3 100644 --- a/test/rmtest.txt +++ b/test/rmtest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/save_after_tests.py b/test/save_after_tests.py index 7fc0fbccd46dc141fd8dce33ebbde7367f0fb9fc..0e0139243624911b05f8fcc81b89a29a08519883 100644 --- a/test/save_after_tests.py +++ b/test/save_after_tests.py @@ -1,6 +1,6 @@ """Testing the behaviour of save_after""" -from context import * +from context import pytest, QEditGuiMain, QTimer, StackedWindowGui, QTest, Qt, handle_dialog, os @pytest.fixture @@ -36,9 +36,9 @@ def test_execute_questionnaire_1(run, qtbot): assert run.forwardbutton.text() == "Absenden" assert run.forwardbutton.isEnabled() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) assert run.forwardbutton.text() == "Absenden" - assert run.forwardbutton.isEnabled() == False + assert not run.forwardbutton.isEnabled() os.remove("./test/results/results.csv") @@ -50,13 +50,12 @@ def test_execute_questionnaire_2(run2, qtbot): assert run2.Stack.count() == 2 assert run2.forwardbutton.text() == "Weiter" assert run2.forwardbutton.isEnabled() - QTest.mouseClick(run2.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton) assert run2.forwardbutton.text() == "Absenden" assert run2.forwardbutton.isEnabled() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run2.forwardbutton, Qt.LeftButton) - assert run2.forwardbutton.isEnabled() == False - + QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton) + assert not run2.forwardbutton.isEnabled() os.remove("./test/results/results.csv") @@ -68,11 +67,11 @@ def test_execute_questionnaire_3(run3, qtbot): assert run3.forwardbutton.text() == "Absenden" assert run3.forwardbutton.isEnabled() QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run3.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run3.forwardbutton, Qt.MouseButton.LeftButton) assert run3.forwardbutton.text() == "Weiter" assert run3.forwardbutton.isEnabled() - QTest.mouseClick(run3.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run3.forwardbutton, Qt.MouseButton.LeftButton) assert run3.forwardbutton.text() == "Weiter" - assert run3.forwardbutton.isEnabled() == False + assert not run3.forwardbutton.isEnabled() os.remove("./test/results/results.csv") diff --git a/test/sltest.txt b/test/sltest.txt index ba3c2ca17c255696fc10fe84554941cdc004f407..2fbb17a39c16e7a91a6c88c706f72f7548f6295c 100644 --- a/test/sltest.txt +++ b/test/sltest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/str_to_list_test.py b/test/str_to_list_test.py index 7323784ab7fe0235ade3f89a6fa8e1903854b124..540f3c529d10b647ce9d6e9f3d2af3216bc7d637 100644 --- a/test/str_to_list_test.py +++ b/test/str_to_list_test.py @@ -1,6 +1,6 @@ """Test if the string_to_list function in Validator.py is working correctly.""" -from context import * +from context import string_to_list def test_single_string(): @@ -67,7 +67,7 @@ def test_quotes(): # TODO this does not work, should it? ''' -def test_quotes_comma(): +def test_quotes_comma(): assert string_to_list("except 'this, that' one") == ["except 'this, that' one"] assert string_to_list("[except 'this, that' one]") == ["except 'this, that' one"] assert string_to_list("except 'this, that'") == ["except 'this, that'"] diff --git a/test/test_helpers.py b/test/test_helpers.py index 6837bc68d6cf97c87cd49aa013120d97b54c7150..63e5525c368b79f4ea4eb1a2b8d4cac44991eb9a 100644 --- a/test/test_helpers.py +++ b/test/test_helpers.py @@ -3,9 +3,9 @@ import os import keyboard import psutil -from PyQt5.QtCore import Qt -from PyQt5.QtTest import QTest -from PyQt5.QtWidgets import QApplication, QMessageBox, QLineEdit, QWidgetItem, QHBoxLayout +from PySide6.QtCore import Qt +from PySide6.QtTest import QTest +from PySide6.QtWidgets import QApplication, QMessageBox, QLineEdit, QWidgetItem, QHBoxLayout, QFormLayout PUPIL_PATH = "C:\\Program Files (x86)\\Pupil-Labs\\Pupil v3.5.1\\Pupil Capture v3.5.1\\pupil_capture.exe" @@ -14,7 +14,7 @@ PUPIL_PATH = "C:\\Program Files (x86)\\Pupil-Labs\\Pupil v3.5.1\\Pupil Capture v def handle_dialog_sa(): """Click 'No' on change save_after dialog.""" dialog = QApplication.activeModalWidget() - QTest.mouseClick(dialog.buttons()[1], Qt.LeftButton) + QTest.mouseClick(dialog.buttons()[1], Qt.MouseButton.LeftButton) # noinspection PyArgumentList @@ -37,28 +37,28 @@ def handle_dialog_q(): def handle_dialog(): """Click 'Yes' on save dialog.""" dialog = QApplication.activeModalWidget() - QTest.mouseClick(dialog.buttons()[0], Qt.LeftButton) + QTest.mouseClick(dialog.buttons()[0], Qt.MouseButton.LeftButton) # noinspection PyArgumentList def handle_dialog_no_save(): """Click 'No' on save dialog.""" dialog = QApplication.activeModalWidget() - QTest.mouseClick(dialog.buttons()[1], Qt.LeftButton) + QTest.mouseClick(dialog.buttons()[1], Qt.MouseButton.LeftButton) # noinspection PyArgumentList def handle_dialog_error(): """Click 'OK' on error dialog.""" dialog = QApplication.activeModalWidget() - QTest.mouseClick(dialog.button(QMessageBox.Ok), Qt.LeftButton) + QTest.mouseClick(dialog.button(QMessageBox.StandardButton.Ok), Qt.MouseButton.LeftButton) # noinspection PyArgumentList def handle_dialog_warning(): """Click 'Yes' on dialog and execute questionnaire.""" dialog = QApplication.activeModalWidget() - QTest.mouseClick(dialog.button(QMessageBox.Yes), Qt.LeftButton) + QTest.mouseClick(dialog.button(QMessageBox.StandardButton.Yes), Qt.MouseButton.LeftButton) # noinspection PyArgumentList @@ -91,12 +91,12 @@ def find_row_by_label(layout, label): row of the field """ for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem and layout.itemAt(row, 0).widget().text() == label: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label: return row - elif type(layout.itemAt(row, 1)) == QHBoxLayout: - for child in range(layout.itemAt(row, 1).count()): - if type(layout.itemAt(row, 1).itemAt(child)) == QWidgetItem and \ - layout.itemAt(row, 1).itemAt(child).widget().objectName() == label: + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout): + for child in range(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count()): + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(child), QWidgetItem) and \ + layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(child).widget().objectName() == label: return row, child @@ -104,3 +104,4 @@ def open_pupil(): """Checks if Pupil Capture is open and if not starts it.""" if "pupil_capture.exe" not in (i.name() for i in psutil.process_iter()): os.startfile(PUPIL_PATH) # subprocess.call([PUPIL_PATH]) ? + QTest.qWait(2000) diff --git a/test/text_test.py b/test/text_test.py index bab204f63e4a99ea9f4447223290b224fe8118c0..52d444b70a055837e0f05150f84c8dc57e8b4448 100644 --- a/test/text_test.py +++ b/test/text_test.py @@ -1,6 +1,6 @@ """Testing the behaviour of AnswerTextField.py + QEditGui.py""" -from context import * +from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, QPlainTextEdit, QHBoxLayout, QRadioButton, QIntValidator, QDoubleValidator, QRegularExpressionValidator, QButtonGroup @pytest.fixture @@ -27,19 +27,19 @@ def run(): # noinspection PyArgumentList def test_create(gui_init, qtbot): # create a page - assert gui_init.gui.page_add.isEnabled() == True + assert gui_init.gui.page_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_p) - QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000) tv = gui_init.gui.treeview # create a question tv.setCurrentItem(tv.topLevelItem(0).child(0)) - assert gui_init.gui.question_add.isEnabled() == True + assert gui_init.gui.question_add.isEnabled() QTest.qWait(500) QTimer.singleShot(100, handle_dialog_q) - QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1) + QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000) assert tv.itemAt(0, 0).text(0) == "<new questionnaire>" assert tv.topLevelItemCount() == 1 assert tv.topLevelItem(0).childCount() == 1 @@ -52,36 +52,36 @@ def test_create(gui_init, qtbot): tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' assert len(tv.selectedItems()) == 1 assert tv.selectedItems()[0].text(0) == "Question 1" - QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down) - QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter) + QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down) + QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter) assert gui_init.gui.questiontype.currentText() == "Text" # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable) layout = gui_init.gui.edit_layout not_none_rows = 0 for row in range(layout.rowCount()): - if type(layout.itemAt(row, 1)) == QWidgetItem: + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem): not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Text"][0].keys() - assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \ - 'TextEdit' if fields_per_type["Text"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\ - else fields_per_type["Text"][0][layout.itemAt(row, 0).widget().text()] - if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Text"][0] + assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \ + 'TextEdit' if fields_per_type["Text"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\ + else fields_per_type["Text"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \ + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \ default_values: - assert layout.itemAt(row, 1).widget().isChecked() == default_values[ - layout.itemAt(row, 0).widget().text()] - elif type(layout.itemAt(row, 1)) == QHBoxLayout and layout.itemAt(row, 1).count() > 0: + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[ + layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] + elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout) and layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count() > 0: not_none_rows += 1 - assert layout.itemAt(row, 0).widget().text() in fields_per_type["Text"][0].keys() - for cnt in range(layout.itemAt(row, 1).count()): - if type(layout.itemAt(row, 1).itemAt(cnt).widget()) == QRadioButton: - assert layout.itemAt(row, 1).itemAt(cnt).widget().group().checkedId() + 1 == \ - default_values[layout.itemAt(row, 0).widget().text()] + assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Text"][0] + for cnt in range(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count()): + if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(cnt).widget(), QRadioButton): + assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(cnt).widget().group().checkedId() + 1 == \ + default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] assert not_none_rows == len(fields_per_type["Text"][0].keys()) assert len(gui_init.undo_stack) == 5 # 2 for creating page & question, 3 for choosing Text @@ -96,7 +96,7 @@ def test_create(gui_init, qtbot): structure["Page 1"][key] = value structure["Page 1"]["Question 1"] = {"type": "Text"} for key, value in default_values.items(): - if key in fields_per_type["Text"][0].keys(): + if key in fields_per_type["Text"][0]: structure["Page 1"]["Question 1"][key] = value listify(gui_init.structure) listify(structure) @@ -126,8 +126,8 @@ def test_create(gui_init, qtbot): def test_policy(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -135,33 +135,33 @@ def test_policy(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'policy') - policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget() + policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget() assert policy_cb.currentText() == 'None' assert find_row_by_label(gui_load.gui.edit_layout, "min") is None assert find_row_by_label(gui_load.gui.edit_layout, "max") is None assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/tftest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == QLineEdit: + if isinstance(child, QLineEdit): assert child.validator() is None test_gui.close() - QTest.mouseClick(policy_cb, Qt.LeftButton) - QTest.keyClick(policy_cb, Qt.Key_Down) - QTest.keyClick(policy_cb, Qt.Key_Enter) + QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000) assert policy_cb.currentText() == "int" - assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos+1, 1) - assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos+1, 3) + assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1) + assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3) assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout) hbox = None for box in hboxes: - if type(box.itemAt(1).widget()) == QLineEdit: + if isinstance(box.itemAt(1).widget(), QLineEdit): hbox = box QTest.keyClicks(hbox.itemAt(1).widget(), '1') hbox.itemAt(1).widget().editingFinished.emit() @@ -171,24 +171,26 @@ def test_policy(gui_load, qtbot): assert hbox.itemAt(3).widget().text() == '100' gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['int', '1', '100'] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + gui_load.save() # have to enforce save since focus is lost somwhow.... + QTest.qWait(1000) test_gui = StackedWindowGui("./test/tftest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == QLineEdit: - assert type(child.validator()) == QIntValidator + if isinstance(child, QLineEdit): + assert isinstance(child.validator(), QIntValidator) test_gui.close() - QTest.mouseClick(policy_cb, Qt.LeftButton) - QTest.keyClick(policy_cb, Qt.Key_Down) - QTest.keyClick(policy_cb, Qt.Key_Enter) + QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000) assert policy_cb.currentText() == "double" - assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos+1, 1) - assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos+1, 3) - assert find_row_by_label(gui_load.gui.edit_layout, "dec") == (answers_pos+1, 5) + assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1) + assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3) + assert find_row_by_label(gui_load.gui.edit_layout, "dec") == (answers_pos + 1, 5) assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout) for box in hboxes: - if type(box.itemAt(1).widget()) == QLineEdit: + if isinstance(box.itemAt(1).widget(), QLineEdit): hbox = box QTest.keyClicks(hbox.itemAt(1).widget(), '1') hbox.itemAt(1).widget().editingFinished.emit() @@ -201,16 +203,18 @@ def test_policy(gui_load, qtbot): assert hbox.itemAt(5).widget().text() == '2' gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['double', '1', '100', '2'] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + gui_load.save() # have to enforce save since focus is lost somwhow.... + QTest.qWait(1000) test_gui = StackedWindowGui("./test/tftest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == QLineEdit: - assert type(child.validator()) == QDoubleValidator + if isinstance(child, QLineEdit): + assert isinstance(child.validator(), QDoubleValidator) test_gui.close() - QTest.mouseClick(policy_cb, Qt.LeftButton) - QTest.keyClick(policy_cb, Qt.Key_Down) - QTest.keyClick(policy_cb, Qt.Key_Enter) + QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000) assert policy_cb.currentText() == "regex" assert find_row_by_label(gui_load.gui.edit_layout, "min") is None assert find_row_by_label(gui_load.gui.edit_layout, "max") is None @@ -218,32 +222,34 @@ def test_policy(gui_load, qtbot): assert find_row_by_label(gui_load.gui.edit_layout, "exp") == (answers_pos + 1, 1) hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout) for box in hboxes: - if type(box.itemAt(1).widget()) == QLineEdit: + if isinstance(box.itemAt(1).widget(), QLineEdit): hbox = box QTest.keyClicks(hbox.itemAt(1).widget(), '[A-Z]') hbox.itemAt(1).widget().editingFinished.emit() assert hbox.itemAt(1).widget().text() == '[A-Z]' gui_load.gui.refresh_button.click() assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['regex', '[A-Z]'] - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) + gui_load.save() # have to enforce save since focus is lost somwhow.... + QTest.qWait(1000) test_gui = StackedWindowGui("./test/tftest.txt") for child in test_gui.Stack.currentWidget().children(): - if type(child) == QLineEdit: - assert type(child.validator()) == QRegExpValidator + if isinstance(child, QLineEdit): + assert isinstance(child.validator(), QRegularExpressionValidator) test_gui.close() - QTest.mouseClick(policy_cb, Qt.LeftButton) - QTest.keyClick(policy_cb, Qt.Key_Up) - QTest.keyClick(policy_cb, Qt.Key_Up) - QTest.keyClick(policy_cb, Qt.Key_Up) - QTest.keyClick(policy_cb, Qt.Key_Enter) + QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Up) + QTest.keyClick(policy_cb, Qt.Key.Key_Up) + QTest.keyClick(policy_cb, Qt.Key.Key_Up) + QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000) assert policy_cb.currentText() == 'None' assert find_row_by_label(gui_load.gui.edit_layout, "min") is None assert find_row_by_label(gui_load.gui.edit_layout, "max") is None assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None assert gui_load.structure["Page 1"]["Question 1"]["size"] == '1' - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.save() gui_load.close() QTest.qWait(500) @@ -253,8 +259,8 @@ def test_policy(gui_load, qtbot): def test_policy_enable(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -262,9 +268,9 @@ def test_policy_enable(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'policy') - policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget() + policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget() assert policy_cb.currentText() == 'None' assert find_row_by_label(gui_load.gui.edit_layout, "min") is None assert find_row_by_label(gui_load.gui.edit_layout, "max") is None @@ -274,24 +280,24 @@ def test_policy_enable(gui_load, qtbot): hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout) hbox = None for box in hboxes: - if box.count() > 0 and type(box.itemAt(0).widget()) == QRadioButton: + if box.count() > 0 and isinstance(box.itemAt(0).widget(), QRadioButton): hbox = box - assert type(hbox.itemAt(1).widget()) == QRadioButton + assert isinstance(hbox.itemAt(1).widget(), QRadioButton) assert hbox.findChild(QButtonGroup).checkedId() == 0 - assert hbox.itemAt(1).widget().isChecked() == False + assert not hbox.itemAt(1).widget().isChecked() hbox.itemAt(1).widget().click() - assert hbox.itemAt(1).widget().isChecked() == True + assert hbox.itemAt(1).widget().isChecked() assert hbox.findChild(QButtonGroup).checkedId() == 1 assert policy_cb.currentText() == 'None' - assert policy_cb.isEnabled() == False + assert not policy_cb.isEnabled() hbox.itemAt(0).widget().click() - assert hbox.itemAt(0).widget().isChecked() == True + assert hbox.itemAt(0).widget().isChecked() assert policy_cb.currentText() == 'None' - assert policy_cb.isEnabled() == True - QTest.mouseClick(policy_cb, Qt.LeftButton) - QTest.keyClick(policy_cb, Qt.Key_Down) - QTest.keyClick(policy_cb, Qt.Key_Enter) + assert policy_cb.isEnabled() + QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000) + QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000) assert policy_cb.currentText() == "int" assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1) assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3) @@ -299,18 +305,18 @@ def test_policy_enable(gui_load, qtbot): assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None hbox.itemAt(1).widget().click() - assert hbox.itemAt(1).widget().isChecked() == True + assert hbox.itemAt(1).widget().isChecked() assert hbox.findChild(QButtonGroup).checkedId() == 1 assert policy_cb.currentText() == 'None' - assert policy_cb.isEnabled() == False + assert not policy_cb.isEnabled() hbox.itemAt(0).widget().click() - assert hbox.itemAt(0).widget().isChecked() == True + assert hbox.itemAt(0).widget().isChecked() assert hbox.findChild(QButtonGroup).checkedId() == 0 assert policy_cb.currentText() == 'None' - assert policy_cb.isEnabled() == True + assert policy_cb.isEnabled() assert gui_load.structure["Page 1"]["Question 1"]["size"] == 1 - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.save() gui_load.close() @@ -323,15 +329,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot): found_le = False found_te = False for child in run.Stack.currentWidget().children(): - if type(child) == QLineEdit: + if isinstance(child, QLineEdit): found_le = True - elif type(child) == QPlainTextEdit: + elif isinstance(child, QPlainTextEdit): found_te = True - assert found_le == True - assert found_te == False + assert found_le + assert not found_te QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_tf.csv', mode='r') as file: @@ -340,15 +346,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'tf' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'tf' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == '' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == '' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_tf.csv") @@ -357,11 +363,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): with mock_file(r'./test/results/results_tf.csv'): assert run.Stack.count() == 1 QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -369,15 +375,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'tf' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'tf' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == '' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == '' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) @@ -387,13 +393,13 @@ def test_execute_questionnaire(run, qtbot): os.remove("./test/results/results_tf.csv") assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) is QLineEdit: + if isinstance(child, QLineEdit): assert child.text() == '' - QTest.keyClicks(child, "texttext", modifier=Qt.NoModifier, delay=1) + QTest.keyClicks(child, "texttext", modifier=Qt.KeyboardModifier.NoModifier, delay=500) assert child.text() == 'texttext' QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_tf.csv', mode='r') as file: @@ -402,15 +408,15 @@ def test_execute_questionnaire(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'tf' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'tf' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == 'texttext' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'texttext' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_tf.csv") @@ -419,18 +425,18 @@ def test_execute_questionnaire_blocked(run, qtbot): with mock_file(r'./test/results/results_tf.csv'): assert run.Stack.count() == 1 for child in run.Stack.currentWidget().children(): - if type(child) is QLineEdit: + if isinstance(child, QLineEdit): assert child.text() == '' - QTest.keyClicks(child, "texttext", modifier=Qt.NoModifier, delay=1) + QTest.keyClicks(child, "texttext", modifier=Qt.KeyboardModifier.NoModifier, delay=500) assert child.text() == 'texttext' QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(run.forwardbutton, Qt.LeftButton) + QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton) res_file = None for file in os.listdir("./test/results/"): if file.find("_backup_"): - res_file = "./test/results/{}".format(file) + res_file = f'./test/results/{file}' results = [] with open(res_file, mode='r') as file: csv_file = csv.reader(file, delimiter=';') @@ -438,15 +444,15 @@ def test_execute_questionnaire_blocked(run, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'tf' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'tf' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '-1' # participant number unknown - assert lines[1] == 'texttext' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '-1' # participant number unknown + assert results[1] == 'texttext' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove(res_file) @@ -454,8 +460,8 @@ def test_execute_questionnaire_blocked(run, qtbot): def test_execute_textedit(gui_load, qtbot): QTimer.singleShot(150, handle_dialog_error) error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure) - assert error_found == False - assert warning_found == False + assert not error_found + assert not warning_found tv = gui_load.gui.treeview tv.expandAll() tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0)) # should be 'Question 1' @@ -463,38 +469,38 @@ def test_execute_textedit(gui_load, qtbot): assert tv.selectedItems()[0].text(0) == "Question 1" rect = tv.visualItemRect(tv.currentItem()) - QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center()) + QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center()) answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'policy') - policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget() + policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget() hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout) hbox = None for box in hboxes: - if box.count() > 0 and type(box.itemAt(0).widget()) == QRadioButton: + if box.count() > 0 and isinstance(box.itemAt(0).widget(), QRadioButton): hbox = box - assert type(hbox.itemAt(1).widget()) == QRadioButton + assert isinstance(hbox.itemAt(1).widget(), QRadioButton) assert hbox.findChild(QButtonGroup).checkedId() == 0 - assert hbox.itemAt(1).widget().isChecked() == False + assert not hbox.itemAt(1).widget().isChecked() hbox.itemAt(1).widget().click() - assert hbox.itemAt(1).widget().isChecked() == True + assert hbox.itemAt(1).widget().isChecked() assert hbox.findChild(QButtonGroup).checkedId() == 1 assert policy_cb.currentText() == 'None' - assert policy_cb.isEnabled() == False + assert not policy_cb.isEnabled() if os.path.exists("./test/results/results_tf.csv"): os.remove("./test/results/results_tf.csv") gui_load.gui.refresh_button.click() - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) test_gui = StackedWindowGui("./test/tftest.txt") assert test_gui.Stack.count() == 1 for child in test_gui.Stack.currentWidget().children(): - if type(child) is QPlainTextEdit: + if isinstance(child, QPlainTextEdit): assert child.toPlainText() == '' - QTest.keyClicks(child, "texttext", modifier=Qt.NoModifier, delay=1) + QTest.keyClicks(child, "texttext", modifier=Qt.KeyboardModifier.NoModifier, delay=500) assert child.toPlainText() == 'texttext' QTimer.singleShot(100, handle_dialog) - QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton) + QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton) results = [] with open('./test/results/results_tf.csv', mode='r') as file: @@ -503,30 +509,30 @@ def test_execute_textedit(gui_load, qtbot): for lines in csv_file: results = lines if results[0].startswith('data'): - assert lines[0] == 'data_row_number' # participant number - assert lines[1] == 'tf' - assert lines[2] == 'Start' - assert lines[3] == 'End' + assert results[0] == 'data_row_number' # participant number + assert results[1] == 'tf' + assert results[2] == 'Start' + assert results[3] == 'End' assert len(results) == 4 - assert lines[0] == '1' # participant number - assert lines[1] == 'texttext' - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2]) # timestamp - assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3]) # timestamp + assert results[0] == '1' # participant number + assert results[1] == 'texttext' + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2]) # timestamp + assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3]) # timestamp os.remove("./test/results/results_tf.csv") assert hbox.findChild(QButtonGroup).checkedId() == 1 - assert hbox.itemAt(1).widget().isChecked() == True + assert hbox.itemAt(1).widget().isChecked() hbox.itemAt(0).widget().click() - assert hbox.itemAt(0).widget().isChecked() == True + assert hbox.itemAt(0).widget().isChecked() assert hbox.findChild(QButtonGroup).checkedId() == 0 assert policy_cb.currentText() == 'None' - assert policy_cb.isEnabled() == True + assert policy_cb.isEnabled() gui_load.gui.refresh_button.click() - assert hbox.itemAt(0).widget().isChecked() == True + assert hbox.itemAt(0).widget().isChecked() assert hbox.findChild(QButtonGroup).checkedId() == 0 assert policy_cb.currentText() == 'None' - assert policy_cb.isEnabled() == True + assert policy_cb.isEnabled() assert gui_load.structure['Page 1']['Question 1']['size'] == 1 - QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier) + QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000) gui_load.save() gui_load.close() diff --git a/test/tftest.txt b/test/tftest.txt index fe78ab161b827c42004bfe60f18e5ef8df6969dc..f08d2f0e9cf6d1656ae81bd238848c3e26835e5e 100644 --- a/test/tftest.txt +++ b/test/tftest.txt @@ -1,4 +1,4 @@ -# Created with QUEST version 1.0.6 +# Created with QUEST version 1.1.0. go_back = True back_text = Zurück forward_text = Weiter diff --git a/test/validate_test.py b/test/validate_test.py index cec703cf3fb2c5821a8f5e87b41b41aa0650f77f..b85e4fd77ce01933913aa6589daa20bf172a80e8 100644 --- a/test/validate_test.py +++ b/test/validate_test.py @@ -1,12 +1,17 @@ """Test if the validate function in Validator.py is working correctly.""" -from context import * +from context import pytest, QTimer, QTest, Qt, ConfigObj, validate_questionnaire, QApplication, QMessageBox, ConfigObjError @pytest.fixture def gui_init(): """Start GUI""" - gui = QApplication([]) + if not QApplication.instance(): + gui = QApplication([]) + else: + while QApplication.instance(): + QApplication.instance().shutdown() + gui = QApplication([]) return gui @@ -20,7 +25,7 @@ def test_global_settings(gui_init): dialog = QApplication.activeModalWidget() global text text = dialog.detailedText() - QTest.mouseClick(dialog.button(QMessageBox.Ok), Qt.LeftButton) + QTest.mouseClick(dialog.button(QMessageBox.StandardButton.Ok), Qt.MouseButton.LeftButton) structure = ConfigObj() structure["go_back"] = True @@ -31,66 +36,66 @@ def test_global_settings(gui_init): structure["help_text"] = "Help" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid help IP(v4) found.\n") > -1 structure["help_ip"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No help_ip found, but help port. Calling help will be disabled.\n" structure.pop("help_ip") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No help_ip found, but help port. Calling help will be disabled.\n" structure["help_ip"] = "127.0.0.1" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["help_port"] = "abcd" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid help port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid help port, could not be converted to a number 0-65535.\n") > -1 structure["help_port"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No help_port found, but IP. Calling help will be disabled.\n" structure.pop("help_port") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No help_port found, but IP. Calling help will be disabled.\n" structure["help_port"] = -1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid help port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid help port, could not be converted to a number 0-65535.\n") > -1 structure["help_port"] = 65536 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid help port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid help port, could not be converted to a number 0-65535.\n") > -1 structure["help_port"] = 3500 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure.pop("help_text") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No text given for the help button, but a connection. The external logging will still work.\n" structure["help_text"] = "HELP" structure.pop("help_ip") structure.pop("help_port") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No help connection given, but text. Calling help will be disabled.\n" structure.pop("help_text") # -------audio------- @@ -98,78 +103,78 @@ def test_global_settings(gui_init): structure["audio_port"] = "2000" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid audio IP(v4) found.\n") > -1 structure["audio_ip"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No audio_ip found, but audio port. Audio will be disabled.\n" structure.pop("audio_ip") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No audio_ip found, but audio port. Audio will be disabled.\n" structure["audio_ip"] = "127.0.0.1" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["audio_port"] = "abcd" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid audio port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid audio port, could not be converted to a number 0-65535.\n") > -1 structure["audio_port"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No audio_port found, but IP. Audio will be disabled.\n" structure.pop("audio_port") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No audio_port found, but IP. Audio will be disabled.\n" structure["audio_port"] = -1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid audio port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid audio port, could not be converted to a number 0-65535.\n") > -1 structure["audio_port"] = 65536 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid audio port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid audio port, could not be converted to a number 0-65535.\n") > -1 structure["audio_port"] = 3500 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["audio_recv_port"] = "abcd" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid audio receive port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid audio receive port, could not be converted to a number 0-65535.\n") > -1 structure["audio_recv_port"] = -1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid audio receive port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid audio receive port, could not be converted to a number 0-65535.\n") > -1 structure["audio_recv_port"] = 65536 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid audio receive port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid audio receive port, could not be converted to a number 0-65535.\n") > -1 structure["audio_recv_port"] = 3500 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure.pop("audio_ip") structure.pop("audio_port") structure.pop("audio_recv_port") @@ -179,75 +184,75 @@ def test_global_settings(gui_init): structure["video_player"] = "VLC" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid video IP(v4) found.\n") > -1 structure["video_ip"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No video_ip found, but video port. Video will be disabled.\n" structure.pop("video_ip") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No video_ip found, but video port. Video will be disabled.\n" structure["video_ip"] = "127.0.0.1" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["video_port"] = "abcd" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid video port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid video port, could not be converted to a number 0-65535.\n") > -1 structure["video_port"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No video_port found, but IP. Video will be disabled.\n" structure.pop("video_port") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No video_port found, but IP. Video will be disabled.\n" structure["video_port"] = -1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid video port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid video port, could not be converted to a number 0-65535.\n") > -1 structure["video_port"] = 65536 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid video port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid video port, could not be converted to a number 0-65535.\n") > -1 structure["video_port"] = 3500 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["video_player"] = "None" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No video_player chosen, but IP and port. Video will be disabled.\n" structure.pop("video_player") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No video_player found, but IP and port. Video will be disabled.\n" structure["video_player"] = "abc" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid value for video_player.\n") > -1 structure["video_player"] = "MadMapper" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure.pop("video_ip") structure.pop("video_port") structure.pop("video_player") @@ -256,86 +261,86 @@ def test_global_settings(gui_init): structure["pupil_port"] = "2000" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid pupil IP(v4) found.\n") > -1 structure["pupil_ip"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No pupil_ip found, but pupil port. The connection to pupil will be disabled.\n" structure.pop("pupil_ip") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No pupil_ip found, but pupil port. The connection to pupil will be disabled.\n" structure["pupil_ip"] = "127.0.0.1" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["pupil_port"] = "abcd" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid pupil port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid pupil port, could not be converted to a number 0-65535.\n") > -1 structure["pupil_port"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No pupil_port found, but IP. The connection to pupil will be disabled.\n" structure.pop("pupil_port") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No pupil_port found, but IP. The connection to pupil will be disabled.\n" structure["pupil_port"] = -1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid pupil port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid pupil port, could not be converted to a number 0-65535.\n") > -1 structure["pupil_port"] = 65536 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid pupil port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid pupil port, could not be converted to a number 0-65535.\n") > -1 structure["pupil_port"] = 3500 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure.pop("pupil_ip") structure.pop("pupil_port") # ------navigation------- structure.pop("go_back") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No option for 'go_back' found, using False as default value.\n" structure["back_text"] = "back" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "Backwards navigation is not allowed but text for back button was set. The button will not be displayed.\n" structure["forward_text"] = "back" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[1] == "Text for forward and backward button are the same.\n" structure.pop("back_text") structure["send_text"] = "back" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "Text for forward and send button are the same.\n" structure.pop("forward_text") structure.pop("send_text") structure["go_back"] = "maybe" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("No valid value found for 'go_back'.\n") > -1 structure["go_back"] = "false" # TODO Tests for pagecount_text? @@ -346,87 +351,87 @@ def test_global_settings(gui_init): structure["global_osc_recv_port"] = 5000 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid global_osc IP(v4) found.\n") > -1 structure["global_osc_ip"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No global_osc_ip found, but global_osc_send_port. Sending over global OSC will be disabled.\n" structure.pop("global_osc_ip") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No global_osc_ip found, but global_osc_send_port. Sending over global OSC will be disabled.\n" structure["global_osc_ip"] = "127.0.0.1" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["global_osc_send_port"] = "abcd" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid global_osc_send_port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid global_osc_send_port, could not be converted to a number 0-65535.\n") > -1 structure["global_osc_send_port"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No global_osc_send_port found, but IP. Sending over global will be disabled.\n" structure.pop("global_osc_send_port") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No global_osc_send_port found, but IP. Sending over global will be disabled.\n" structure["global_osc_send_port"] = -1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid global_osc_send_port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid global_osc_send_port, could not be converted to a number 0-65535.\n") > -1 structure["global_osc_send_port"] = 65536 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid global_osc_send_port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid global_osc_send_port, could not be converted to a number 0-65535.\n") > -1 structure["global_osc_send_port"] = 3500 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure.pop("global_osc_recv_port") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No global_osc_recv_port found, but IP. Receiving over global will be disabled.\n" structure["global_osc_recv_port"] = "abcd" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid global_osc_recv_port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid global_osc_recv_port, could not be converted to a number 0-65535.\n") > -1 structure["global_osc_recv_port"] = -1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid global_osc_recv_port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid global_osc_recv_port, could not be converted to a number 0-65535.\n") > -1 structure["global_osc_recv_port"] = 65536 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid global_osc_recv_port, couldn't be converted to a number 0-65535.\n") > -1 + assert err + assert not warn + assert -1 <= text.find("Invalid global_osc_recv_port, could not be converted to a number 0-65535.\n") > -1 structure["global_osc_recv_port"] = 3500 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure.pop("global_osc_send_port") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "No global_osc_send_port found, but IP. Sending over global will be disabled.\n" structure.pop("global_osc_ip") structure.pop("global_osc_recv_port") @@ -435,25 +440,25 @@ def test_global_settings(gui_init): structure["save_after"] = "5" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("The value given for 'save_after' is not the name of a page of this questionnaire.\n") > -1 structure.pop("save_after") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False - #assert det[0] == "No value for 'save_after' given, saving after the last page by default.\n" + assert not err + assert not warn + # assert det[0] == "No value for 'save_after' given, saving after the last page by default.\n" structure["save_after"] = None err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn # TODO test for having a page # no tests needed for save_message structure["answer_pos"] = "maybe" structure["answer_neg"] = "maybe" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "Text for positive and negative answer are the same.\n" structure.pop("answer_pos") structure.pop("answer_neg") @@ -461,106 +466,106 @@ def test_global_settings(gui_init): structure["delimiter"] = "none" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid delimiter found. It can only have one character.\n") > -1 structure["delimiter"] = "\t" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure.pop("delimiter") structure["filepath_results"] = "A://some/weird/path/res.txt" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == True + assert err + assert warn assert det[0] == "Path for results file does not exist. It will be created.\n" assert -1 <= text.find("Invalid drive name for results file path.\n") > -1 structure["filepath_results"] = "./test/results/results.csv" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["filepath_results"] = "./test/results/new/results.csv" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "Path for results file does not exist. It will be created.\n" structure.pop("filepath_results") # ------style------ structure["button_fade"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("'button_fade' could not be converted to a non-negative number.\n") > -1 structure["button_fade"] = -5 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("'button_fade' could not be converted to a non-negative number.\n") > -1 structure["button_fade"] = "600" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["stylesheet"] = "A://B/C/D.css" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid stylesheet path.\n") > -1 structure["stylesheet"] = "./src/Images/RadioChecked.svg" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid file for stylesheet, it has to be *.qss.\n") > -1 structure["stylesheet"] = "./src/stylesheets/minimal.qss" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["randomization"] = "random" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid randomization option.\n") > -1 structure["randomization"] = "None" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["randomization"] = "from file" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Randomization 'from file' chosen, but no file given.\n") > -1 structure["randomization_file"] = "A://B/C/D.css" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid randomization_file path.\n") > -1 structure["randomization_file"] = "./src/Images/RadioChecked.svg" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Invalid file for randomization, it has to be *.txt or *.csv.\n") > -1 structure["randomization_file"] = "./src/Configs/all_question_types.txt" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find("Contents of randomization_file invalid.\n") > -1 structure["randomization_file"] = "./test/random.txt" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure.pop("randomization") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "Randomization_file found, but no option for randomization.\n" gui_init.exit() @@ -572,40 +577,40 @@ def test_page_settings(gui_init): structure["save_after"] = None structure["Page"] = {} err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "There are no questions on page Page.\n" structure["Page"]["Question"] = {"type": "HLine"} err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn # title and description are just text and do not need tests structure["Page"]["pupil_on_next"] = "this page is done" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[0] == "Incomplete connection to pupil given. The connection to pupil will be disabled.\n" structure["pupil_ip"] = "127.0.0.1" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[1] == "Incomplete connection to pupil given. The connection to pupil will be disabled.\n" structure.pop("pupil_ip") structure["pupil_port"] = 9000 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True + assert not err + assert warn assert det[1] == "Incomplete connection to pupil given. The connection to pupil will be disabled.\n" structure["pupil_ip"] = "127.0.0.1" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure.pop("pupil_ip") structure.pop("pupil_port") structure["Page"].pop("pupil_on_next") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn # TODO own test for randomgroup gui_init.exit() @@ -623,7 +628,7 @@ def test_question_settings(gui_init): dialog = QApplication.activeModalWidget() global text text = dialog.detailedText() - QTest.mouseClick(dialog.button(QMessageBox.Ok), Qt.LeftButton) + QTest.mouseClick(dialog.button(QMessageBox.StandardButton.Ok), Qt.MouseButton.LeftButton) structure = ConfigObj() structure["go_back"] = True @@ -631,28 +636,28 @@ def test_question_settings(gui_init): structure["Page"] = {} structure["Page"]["Question"] = {} err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "There are no attributes for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'There are no attributes for question "Question" on page "Page".\n' # ------id------ structure["Page"]["Question"]["id"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No ID was given for question 'Question' on page 'Page'.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No ID was given for question "Question" on page "Page".\n') > -1 structure["Page"]["Question"]["type"] = "HLine" structure["Page"]["Question"].pop("id") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["type"] = "Check" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == True # from the question type - assert -1 <= text.find("No ID was given for question 'Question' on page 'Page'.\n") > -1 + assert err + assert warn # from the question type + assert -1 <= text.find('No ID was given for question "Question" on page "Page".\n') > -1 structure["Page"]["Question"].pop("type") structure["Page"]["Question"].pop("text") structure["Page"]["Question"].pop("answers") @@ -660,85 +665,85 @@ def test_question_settings(gui_init): structure["Page"]["Question2"] = {"id": "some id"} QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("ID 'some id' already used in question 'Question' on page 'Page'. Found again in question 'Question2' on page 'Page'.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('ID "some id" already used in question "Question" on page "Page". Found again in question "Question2" on page "Page".\n') > -1 structure["Page"].pop("Question2") structure["Page2"] = {"Question": {"id": "some id"}} QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "ID 'some id' already used in question 'Question' on page 'Page'. Found again in question 'Question' on page 'Page2'.\n") > -1 + 'ID "some id" already used in question "Question" on page "Page". Found again in question "Question" on page "Page2".\n') > -1 structure.pop("Page2") # ------x------ structure["Page"]["Question"]["x"] = "something" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid value found for 'x' for question 'Question' on page 'Page'.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No valid value found for "x" for question "Question" on page "Page".\n') > -1 structure["Page"]["Question"]["x"] = True err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["type"] = "ABX" structure["Page"]["Question"]["start_cues"] = [1, 2] structure["Page"]["Question"]["track"] = 1 structure["Page"]["Question"].pop("x") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No option for 'x' found for question 'Question' on page 'Page', using False as default value.\n" + assert not err + assert warn + assert det[0] == 'No option for "x" found for question "Question" on page "Page", using False as default value.\n' structure["Page"]["Question"] = {'id': 'id'} # ------play_once------ structure["Page"]["Question"]["play_once"] = "something" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid value found for 'play_once' for question 'Question' on page 'Page'.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No valid value found for "play_once" for question "Question" on page "Page".\n') > -1 structure["Page"]["Question"]["play_once"] = True err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["type"] = "Player" structure["Page"]["Question"]["start_cue"] = 1 structure["Page"]["Question"]["track"] = 1 structure["Page"]["Question"].pop("play_once") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No option for 'play_once' found for question 'Question' on page 'Page', using False by default.\n" + assert not err + assert warn + assert det[0] == 'No option for "play_once" found for question "Question" on page "Page", using False by default.\n' structure["Page"]["Question"] = {'id': 'id'} # ------required------ structure["Page"]["Question"]["required"] = "something" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid value found for 'required' for question 'Question' on page 'Page'.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No valid value found for "required" for question "Question" on page "Page".\n') > -1 structure["Page"]["Question"]["required"] = True err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"].pop("required") # ------labelled------ structure["Page"]["Question"]["labelled"] = "something" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid value found for 'labelled' for question 'Question' on page 'Page'.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No valid value found for "labelled" for question "Question" on page "Page".\n') > -1 structure["Page"]["Question"]["labelled"] = True err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["type"] = "Slider" structure["Page"]["Question"]["min"] = 1 structure["Page"]["Question"]["max"] = 10 @@ -746,45 +751,44 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["start"] = 10 structure["Page"]["Question"].pop("labelled") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[ - 0] == "No option for 'labelled' found for question 'Question' on page 'Page', setting it to False.\n" + assert not err + assert warn + assert det[0] == 'No option for "labelled" found for question "Question" on page "Page", setting it to False.\n' structure["Page"]["Question"] = {'id': 'id'} # ------question_above------ structure["Page"]["Question"]["question_above"] = "something" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid value found for 'question_above' for question 'Question' on page 'Page'.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No valid value found for "question_above" for question "Question" on page "Page".\n') > -1 structure["Page"]["Question"]["question_above"] = True err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"] = {'id': 'id'} # ------text------ structure["Page"]["Question"]["text"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No text was given for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No text was given for question "Question" on page "Page".\n' structure["Page"]["Question"]["type"] = "Plain Text" structure["Page"]["Question"].pop("text") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No text was given for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No text was given for question "Question" on page "Page".\n' structure["Page"]["Question"] = {'id': 'id'} # ------answers------ structure["Page"]["Question"]["answers"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No answer possibilities were given for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No answer possibilities were given for question "Question" on page "Page".\n' structure["audio_ip"] = "127.0.0.1" structure["audio_port"] = 8000 structure["Page"]["Question"]["type"] = "ABX" @@ -793,68 +797,68 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["x"] = False structure["Page"]["Question"]["text"] = "Some text." err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["answers"] = "1" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Please give two answer options for the ABX type question 'Question' on page 'Page' or leave this field empty.\n") + assert err + assert not warn + assert -1 <= text.find('Please give two answer options for the ABX type question "Question" on page "Page" or leave this field empty.\n') structure["Page"]["Question"]["answers"] = ["1", "b", "c"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Please give two answer options for the ABX type question 'Question' on page 'Page' or leave this field empty.\n") + 'Please give two answer options for the ABX type question "Question" on page "Page" or leave this field empty.\n') structure["Page"]["Question"]["answers"] = ["1", "2"] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["answers"] = ("1", "2") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"] = {'id': 'id', "type": "Radio", "text": "some text"} err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No answer possibilities were given for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No answer possibilities were given for question "Question" on page "Page".\n' structure["Page"]["Question"] = {'id': 'id'} # ------start_answer_id------ structure["Page"]["Question"]["start_answer_id"] = -1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The start answer ID in question 'Question' on page 'Page' can't have a negative value.\n") + assert err + assert not warn + assert -1 <= text.find('The start answer ID in question "Question" on page "Page" can not have a negative value.\n') structure["Page"]["Question"]["start_answer_id"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The start answer ID in question 'Question' on page 'Page' couldn't be interpreted as an integer.\n") + assert err + assert not warn + assert -1 <= text.find('The start answer ID in question "Question" on page "Page" could not be interpreted as an integer.\n') structure["Page"]["Question"] = {'id': 'id'} # ------min------ structure["Page"]["Question"]["min"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No minimum value found for the slider in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No minimum value found for the slider in question "Question" on page "Page".\n') structure["Page"]["Question"]["min"] = 1.5 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["min"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The minimum value found for the slider in question 'Question' on page 'Page' couldn't be interpreted as an integer.\n") + assert err + assert not warn + assert -1 <= text.find('The minimum value found for the slider in question "Question" on page "Page" could not be interpreted as an integer.\n') structure["Page"]["Question"]["type"] = "Slider" structure["Page"]["Question"]["max"] = 10 structure["Page"]["Question"]["start"] = 10 @@ -864,28 +868,28 @@ def test_question_settings(gui_init): structure["Page"]["Question"].pop("min") QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No minimum value was given for the slider in question 'Question' on page 'Page'") + assert err + assert not warn + assert -1 <= text.find('No minimum value was given for the slider in question "Question" on page "Page".\n') structure["Page"]["Question"]["min"] = 20 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"] = {'id': 'id'} # ------max------ structure["Page"]["Question"]["max"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No maximum value found for the slider in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No maximum value found for the slider in question "Question" on page "Page".\n') structure["Page"]["Question"]["max"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The maximum value found for the slider in question 'Question' on page 'Page' couldn't be interpreted as an integer.\n") + assert err + assert not warn + assert -1 <= text.find('The maximum value found for the slider in question "Question" on page "Page" could not be interpreted as an integer.\n') structure["Page"]["Question"]["type"] = "Slider" structure["Page"]["Question"]["min"] = 10 structure["Page"]["Question"]["step"] = 0.1 @@ -895,39 +899,39 @@ def test_question_settings(gui_init): structure["Page"]["Question"].pop("max") QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No maximum value was given for the slider in question 'Question' on page 'Page'") + assert err + assert not warn + assert -1 <= text.find('No maximum value was given for the slider in question "Question" on page "Page".\n') structure["Page"]["Question"]["max"] = 0 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["max"] = 0.1 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["max"] = 10 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Maximum and Minimum value for the slider in question 'Question' on page 'Page' are the same.\n") + assert err + assert not warn + assert -1 <= text.find('Maximum and Minimum value for the slider in question "Question" on page "Page" are the same.\n') structure["Page"]["Question"] = {'id': 'id'} # ------start------ structure["Page"]["Question"]["start"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No starting value found for the slider in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No starting value found for the slider in question "Question" on page "Page".\n') structure["Page"]["Question"]["start"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "The starting value found for the slider in question 'Question' on page 'Page' couldn't be interpreted as an integer.\n") + 'The starting value found for the slider in question "Question" on page "Page" could not be interpreted as an integer.\n') structure["Page"]["Question"]["type"] = "Slider" structure["Page"]["Question"]["max"] = 10 structure["Page"]["Question"]["min"] = 0 @@ -937,33 +941,33 @@ def test_question_settings(gui_init): structure["Page"]["Question"].pop("start") QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No starting value was given for the slider in question 'Question' on page 'Page'") + assert err + assert not warn + assert -1 <= text.find('No starting value was given for the slider in question "Question" on page "Page".\n') structure["Page"]["Question"]["start"] = 0 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["start"] = 0.5 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"] = {'id': 'id'} - + # ------step------ structure["Page"]["Question"]["step"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No step value found for the slider in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No step value found for the slider in question "Question" on page "Page".\n') structure["Page"]["Question"]["step"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "The step value found for the slider in question 'Question' on page 'Page' couldn't be interpreted as a number.\n") + 'The step value found for the slider in question "Question" on page "Page" could not be interpreted as a number.\n') structure["Page"]["Question"]["type"] = "Slider" structure["Page"]["Question"]["max"] = 1.5 structure["Page"]["Question"]["min"] = 0.5 @@ -973,26 +977,26 @@ def test_question_settings(gui_init): structure["Page"]["Question"].pop("step") QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No step value was given for the slider in question 'Question' on page 'Page'") + assert err + assert not warn + assert -1 <= text.find('No step value was given for the slider in question "Question" on page "Page".\n') structure["Page"]["Question"]["step"] = 0 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The step value found for the slider in question 'Question' on page 'Page' needs to be bigger than 0.\n") + assert err + assert not warn + assert -1 <= text.find('The step value found for the slider in question "Question" on page "Page" needs to be bigger than 0.\n') structure["Page"]["Question"]["step"] = 2 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "The step value for the slider in question 'Question' on page 'Page' is bigger than the range.\n") + 'The step value for the slider in question "Question" on page "Page" is bigger than the range.\n') structure["Page"]["Question"]["step"] = 0.5 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"] = {'id': 'id'} # ------label------ @@ -1005,218 +1009,212 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["start"] = 0 structure["Page"]["Question"]["label"] = "some label" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["labelled"] = True QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The number of given labels doesn't match the number of ticks for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('The number of given labels does not match the number of ticks for question "Question" on page "Page".\n') structure["Page"]["Question"]["label"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["label"] = [[1, 2, "test"]] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid format for labels for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No valid format for labels for question "Question" on page "Page".\n') structure["Page"]["Question"]["label"] = [[-1, "no"], [11, "out"]] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Tick value outside of slider range found for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Tick value outside of slider range found for question "Question" on page "Page".\n') structure["Page"]["Question"]["label"] = [[5, "no"], [5, "out"]] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Double definition of tick labels found for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Double definition of tick labels found for question "Question" on page "Page".\n') structure["Page"]["Question"]["label"] = [["null", "no"]] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("A label tick for the slider in question 'Question' on page 'Page' couldn't be interpreted as a number.\n") + assert err + assert not warn + assert -1 <= text.find('A label tick for the slider in question "Question" on page "Page" could not be interpreted as a number.\n') structure["Page"]["Question"]["label"] = [[0, "negativ"], [10, "positiv"]] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"] = {'id': 'id'} # ------policy------ structure["Page"]["Question"]["policy"] = "something" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid policy type in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Invalid policy type in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["something"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid policy type in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Invalid policy type in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = "None" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["policy"] = "int" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Policy type 'int' takes two arguments, a different amount was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Policy type "int" takes two arguments, a different amount was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["int", 1, 2, 3] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find( - "Policy type 'int' takes two arguments, a different amount was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Policy type "int" takes two arguments, a different amount was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["int", "", 2] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find( - "No minimum value was given for the policy in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No minimum value was given for the policy in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["int", "ab", 2] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Minimum value given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n") + 'Minimum value given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n') structure["Page"]["Question"]["policy"] = ["int", 1, "ab"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Maximum value given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n") + 'Maximum value given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n') structure["Page"]["Question"]["policy"] = ["int", 1, ""] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No maximum value was given for the policy in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No maximum value was given for the policy in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["int", 1, 100] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["policy"] = "double" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find( - "Policy type 'double' takes three arguments, a different amount was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Policy type "double" takes three arguments, a different amount was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["double", 1, 2, 3, 4] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find( - "Policy type 'double' takes two arguments, a different amount was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Policy type "double" takes two arguments, a different amount was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["double", "", 2, 3] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "No minimum value was given for the policy in question 'Question' on page 'Page'.\n") + 'No minimum value was given for the policy in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["double", "ab", 2, 3] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Minimum value given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n") + 'Minimum value given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n') structure["Page"]["Question"]["policy"] = ["double", 1, "ab", 3] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Maximum value given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n") + 'Maximum value given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n') structure["Page"]["Question"]["policy"] = ["double", 1, "", 3] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No maximum value was given for the policy in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No maximum value was given for the policy in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["double", 1, 2, "ab"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Number of decimals given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n") + 'Number of decimals given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n') structure["Page"]["Question"]["policy"] = ["double", 1, 2, ""] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No number of decimals was given for the policy in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No number of decimals was given for the policy in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["double", 1, 100, 3] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["policy"] = "regex" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find( - "Policy type 'regex' takes one argument, a different amount was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Policy type "regex" takes one argument, a different amount was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["regex", "some", 67] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find( - "Policy type 'regex' takes one argument, a different amount was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Policy type "regex" takes one argument, a different amount was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["regex", ""] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "No regex was given for the policy in question 'Question' on page 'Page'.\n") + 'No regex was given for the policy in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["regex", "[.*"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "An invalid regex was given for the policy in question 'Question' on page 'Page'.\n") + 'An invalid regex was given for the policy in question "Question" on page "Page".\n') structure["Page"]["Question"]["policy"] = ["regex", "[A-Z]\\d"] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"] = {'id': 'id'} # ------start_cue------ structure["Page"]["Question"]["start_cue"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No start cue was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No start cue was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["start_cue"] = [12] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Start cue given in question 'Question' on page 'Page' couldn't be converted to a number.\n") + assert err + assert not warn + assert -1 <= text.find('Start cue given in question "Question" on page "Page" could not be converted to a number.\n') structure["Page"]["Question"]["start_cue"] = 12 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["type"] = "Player" structure["Page"]["Question"].pop("start_cue") structure["Page"]["Question"]["track"] = 1 @@ -1224,61 +1222,61 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["buttons"] = ["Play"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No start cue was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No start cue was given in question "Question" on page "Page".\n') structure["Page"]["Question"] = {'id': 'id'} # ------end_cue------ structure["Page"]["Question"]["end_cue"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No end cue was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No end cue was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["end_cue"] = [12] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("End cue given in question 'Question' on page 'Page' couldn't be converted to a number.\n") + assert err + assert not warn + assert -1 <= text.find('End cue given in question "Question" on page "Page" could not be converted to a number.\n') structure["Page"]["Question"]["end_cue"] = 12 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["start_cue"] = 12 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The same cue (12) was used as start- and end-cue for one condition in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('The same cue (12) was used as start- and end-cue for one condition in question "Question" on page "Page".\n') structure["Page"]["Question"]["end_cue"] = 14 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"] = {'id': 'id'} # ------track------ structure["Page"]["Question"]["track"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No track(s) was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No track(s) was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["track"] = [1] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["track"] = 1 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["track"] = -1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Track given for question 'Question' on page 'Page' needs to be greater than 0.\n") + assert err + assert not warn + assert -1 <= text.find('Track given for question "Question" on page "Page" needs to be greater than 0.\n') structure["Page"]["Question"]["type"] = "Player" structure["Page"]["Question"].pop("track") structure["Page"]["Question"]["start_cue"] = 1 @@ -1286,16 +1284,16 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["buttons"] = ["Play"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No track(s) was given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No track(s) was given in question "Question" on page "Page".\n') structure["Page"]["Question"]["track"] = [1, [1, 1]] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Tracks given for question 'Question' on page 'Page' need to be one or more integers, not lists.\n") + 'Tracks given for question "Question" on page "Page" need to be one or more integers, not lists.\n') structure["Page"]["Question"] = {'id': 'id'} structure["Page"]["Question"]["type"] = "ABX" structure["Page"]["Question"]["start_cues"] = [1, 2] @@ -1303,24 +1301,24 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["x"] = False structure["Page"]["Question"]["track"] = 1 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["track"] = [1] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["track"] = [1, -1] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Track given for question 'Question' on page 'Page' needs to be greater than 0.\n") + assert err + assert not warn + assert -1 <= text.find('Track given for question "Question" on page "Page" needs to be greater than 0.\n') structure["Page"]["Question"]["track"] = [1, [1, 2]] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Tracks given for question 'Question' on page 'Page' need to be one or more integers, not lists.\n") + assert err + assert not warn + assert -1 <= text.find('Tracks given for question "Question" on page "Page" need to be one or more integers, not lists.\n') structure["Page"]["Question"] = {'id': 'id'} structure["Page"]["Question"]["type"] = "MUSHRA" structure["Page"]["Question"]["start_cues"] = [1, 2] @@ -1328,109 +1326,109 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["text"] = "some text" structure["Page"]["Question"]["track"] = 1 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["track"] = [1] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["track"] = [1, 1, 2] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The number of tracks given doesn't equal the number of cues given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('The number of tracks given does not equal the number of cues given in question "Question" on page "Page".\n') structure["Page"]["Question"]["track"] = [1, 2] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["track"] = [1, [1, 2]] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["track"] = [[1, 2], [1, 2, -3]] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Track given for question 'Question' on page 'Page' needs to be greater than 0.\n") + assert err + assert not warn + assert -1 <= text.find('Track given for question "Question" on page "Page" needs to be greater than 0.\n') structure["Page"]["Question"] = {'id': 'id'} # ------crossfade------ structure["Page"]["Question"]["crossfade"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid value found for 'crossfade' for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No valid value found for "crossfade" for question "Question" on page "Page".\n') structure["Page"]["Question"]["crossfade"] = True err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["crossfade"] = 0 - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"] = {'id': 'id'} # ------buttons------ structure["Page"]["Question"]["buttons"] = [] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No buttons are displayed for the player in question 'Question' on page 'Page'. It will play when this page is loaded.\n" + assert not err + assert warn + assert det[0] == 'No buttons are displayed for the player in question "Question" on page "Page". It will play when this page is loaded.\n' structure["Page"]["Question"]["buttons"] = ["Pause"] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No Play button is displayed for the player in question 'Question' on page 'Page'. It will play when this page is loaded.\n" + assert not err + assert warn + assert det[0] == 'No Play button is displayed for the player in question "Question" on page "Page". It will play when this page is loaded.\n' structure["Page"]["Question"]["buttons"] = "Stop" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No Play button is displayed for the player in question 'Question' on page 'Page'. It will play when this page is loaded.\n" + assert not err + assert warn + assert det[0] == 'No Play button is displayed for the player in question "Question" on page "Page". It will play when this page is loaded.\n' structure["Page"]["Question"]["buttons"] = "Reverse" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid value found for 'buttons' for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Invalid value found for "buttons" for question "Question" on page "Page".\n') structure["Page"]["Question"]["buttons"] = ["Skip"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid value found for 'buttons' for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Invalid value found for "buttons" for question "Question" on page "Page".\n') structure["Page"]["Question"]["type"] = "Player" structure["Page"]["Question"]["track"] = 1 structure["Page"]["Question"]["start_cue"] = 1 structure["Page"]["Question"]["play_once"] = False structure["Page"]["Question"].pop("buttons") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No buttons are displayed for the player in question 'Question' on page 'Page'. It will play when this page is loaded.\n" + assert not err + assert warn + assert det[0] == 'No buttons are displayed for the player in question "Question" on page "Page". It will play when this page is loaded.\n' structure["Page"]["Question"] = {'id': 'id'} # ------start_cues------ structure["Page"]["Question"]["start_cues"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No start cues were given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No start cues were given in question "Question" on page "Page".\n') structure["Page"]["Question"]["start_cues"] = ["abc"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Start cues given for question 'Question' on page 'Page' couldn't be converted to a list of number.\n") + assert err + assert not warn + assert -1 <= text.find('Start cues given for question "Question" on page "Page" could not be converted to a list of number.\n') structure["Page"]["Question"]["start_cues"] = "abc" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Start cues given for question 'Question' on page 'Page' couldn't be converted to a list of number.\n") + 'Start cues given for question "Question" on page "Page" could not be converted to a list of number.\n') structure["Page"]["Question"]["type"] = "ABX" structure["Page"]["Question"]["start_cues"] = 14 structure["Page"]["Question"]["track"] = 1 @@ -1438,26 +1436,26 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["x"] = False QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("There should be exactly 2 start_cues for AB(X)-tests, but 1 were given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('There should be exactly 2 start_cues for AB(X)-tests, but 1 were given in question "Question" on page "Page".\n') structure["Page"]["Question"]["start_cues"] = [1, 2, 3] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "There should be exactly 2 start_cues for AB(X)-tests, but 1 were given in question 'Question' on page 'Page'.\n") + 'There should be exactly 2 start_cues for AB(X)-tests, but 1 were given in question "Question" on page "Page".\n') structure["Page"]["Question"]["start_cues"] = [1, 2] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"].pop("start_cues") QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No start cues were given for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No start cues were given for question "Question" on page "Page".\n') structure["Page"]["Question"] = {'id': 'id'} structure["Page"]["Question"]["type"] = "MUSHRA" structure["Page"]["Question"]["end_cues"] = [3, 4] @@ -1465,32 +1463,32 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["track"] = 1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No start cues were given for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No start cues were given for question "Question" on page "Page".\n') structure["Page"]["Question"] = {'id': 'id'} # ------end_cues------ structure["Page"]["Question"]["end_cues"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No end cues were given in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No end cues were given in question "Question" on page "Page".\n') structure["Page"]["Question"]["end_cues"] = ["abc"] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "End cues given for question 'Question' on page 'Page' couldn't be converted to a list of number.\n") + 'End cues given for question "Question" on page "Page" could not be converted to a list of number.\n') structure["Page"]["Question"]["end_cues"] = "abc" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "End cues given for question 'Question' on page 'Page' couldn't be converted to a list of number.\n") + 'End cues given for question "Question" on page "Page" could not be converted to a list of number.\n') structure["Page"]["Question"] = {'id': 'id'} structure["Page"]["Question"]["type"] = "MUSHRA" structure["Page"]["Question"]["start_cues"] = [3, 4] @@ -1498,130 +1496,130 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["track"] = 1 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No end cues were given for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No end cues were given for question "Question" on page "Page".\n') structure["Page"]["Question"]["end_cues"] = [4, 4] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The same cue (4) was used as start- and end-cue for one condition in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('The same cue (4) was used as start- and end-cue for one condition in question "Question" on page "Page".\n') structure["Page"]["Question"]["end_cues"] = [1, 2, 3] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "The number of start- and end-cues in question 'Question' on page 'Page' doesn't match.\n") + 'The number of start- and end-cues in question "Question" on page "Page" does not match.\n') structure["Page"]["Question"] = {'id': 'id'} # ------xfade------ structure["Page"]["Question"]["xfade"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid value found for 'xfade' for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No valid value found for "xfade" for question "Question" on page "Page".\n') structure["Page"]["Question"]["start_cues"] = [1, 1, 2] structure["Page"]["Question"]["end_cues"] = [2, 2, 2] structure["Page"]["Question"]["track"] = [1, 2, 3] structure["Page"]["Question"]["xfade"] = True QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Xfade is only applicable if all start- and end-markers are the same each in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Xfade is only applicable if all start- and end-markers are the same each in question "Question" on page "Page".\n') structure["Page"]["Question"]["start_cues"] = [1, 1, 1] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["track"] = [1, 1, 1] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("For xfade stimuli need to be placed on different tracks in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('For xfade stimuli need to be placed on different tracks in question "Question" on page "Page".\n') structure["Page"]["Question"]["track"] = 2 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("For xfade stimuli need to be placed on different tracks in question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('For xfade stimuli need to be placed on different tracks in question "Question" on page "Page".\n') structure["Page"]["Question"] = {'id': 'id'} # ------inscription------ structure["Page"]["Question"]["inscription"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No inscription for the button in question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No inscription for the button in question "Question" on page "Page".\n' structure["Page"]["Question"]["inscription"] = "None" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "Internally used inscription 'None' used in question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'Internally used inscription "None" used in question "Question" on page "Page".\n' structure["Page"]["Question"].pop("inscription") structure["pupil_ip"] = "127.0.0.1" structure["pupil_port"] = 50500 structure["Page"]["Question"]["type"] = "Button" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No inscription for the button in question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No inscription for the button in question "Question" on page "Page".\n' structure["Page"]["Question"] = {'id': 'id'} # ------objectName------ structure["Page"]["Question"]["objectName"] = "required" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "The objectName in question 'Question' on page 'Page' uses a predefined name.\n" + assert not err + assert warn + assert det[0] == 'The objectName in question "Question" on page "Page" uses a predefined name.\n' structure["Page"]["Question"]["objectName"] = "headline" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "The objectName in question 'Question' on page 'Page' uses a predefined name.\n" + assert not err + assert warn + assert det[0] == 'The objectName in question "Question" on page "Page" uses a predefined name.\n' structure["Page"]["Question"]["objectName"] = "SliderHeader" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "The objectName in question 'Question' on page 'Page' uses a predefined name.\n" + assert not err + assert warn + assert det[0] == 'The objectName in question "Question" on page "Page" uses a predefined name.\n' structure["Page"]["Question"].pop("objectName") # ------timer------ structure["Page"]["Question"]["timer"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The timer in question 'Question' on page 'Page' needs to be a numeric value.\n") + assert err + assert not warn + assert -1 <= text.find('The timer in question "Question" on page "Page" needs to be a numeric value.\n') structure["Page"]["Question"]["timer"] = -20 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "The timer in question 'Question' on page 'Page' needs to be greater than or equal to 0. Setting it to 0 by default.\n" + assert not err + assert warn + assert det[0] == 'The timer in question "Question" on page "Page" needs to be greater than or equal to 0. Setting it to 0 by default.\n' structure["Page"]["Question"].pop("timer") # ------password_file------ structure["Page"]["Question"]["password_file"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No password_file found for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No password_file found for question "Question" on page "Page".\n' structure["Page"]["Question"]["password_file"] = "./invalid/path.txt" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid password_file for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No valid password_file for question "Question" on page "Page".\n') structure["Page"]["Question"]["type"] = "Password" structure["Page"]["Question"]["text"] = "text" structure["Page"]["Question"].pop("password_file") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No password_file found for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No password_file found for question "Question" on page "Page".\n' structure["Page"]["Question"] = {'id': 'id'} # ------button_texts------ @@ -1629,87 +1627,87 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["button_texts"] = [1, 1, 1] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Please give no, two or three (if option X is used) button_texts for the ABX type question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Please give no, two or three (if option X is used) button_texts for the ABX type question "Question" on page "Page".\n') structure["Page"]["Question"]["x"] = True structure["Page"]["Question"]["button_texts"] = [1, 1, 1] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["button_texts"] = [1, 1] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Please give no, two or three (if option X is used) button_texts for the ABX type question 'Question' on page 'Page'.\n") + 'Please give no, two or three (if option X is used) button_texts for the ABX type question "Question" on page "Page".\n') structure["Page"]["Question"]["button_texts"] = "sth" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False + assert err + assert not warn assert -1 <= text.find( - "Please give no, two or three (if option X is used) button_texts for the ABX type question 'Question' on page 'Page'.\n") + 'Please give no, two or three (if option X is used) button_texts for the ABX type question "Question" on page "Page".\n') structure["Page"]["Question"] = {'id': 'id'} # ------randomize------ structure["Page"]["Question"]["randomize"] = "not bool" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid value found for 'randomize' for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No valid value found for "randomize" for question "Question" on page "Page".\n') structure["Page"]["Question"]["type"] = "Matrix" structure["Page"]["Question"]["text"] = "some text" structure["Page"]["Question"]["answers"] = "some answer" structure["Page"]["Question"]["questions"] = "something" structure["Page"]["Question"].pop("randomize") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No option for 'randomize' found for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No option for "randomize" found for question "Question" on page "Page".\n' structure["Page"]["Question"] = {'id': 'id'} # ------questions------ structure["Page"]["Question"]["questions"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No questions for the matrix in question 'Question' on page 'Page' found.\n" + assert not err + assert warn + assert det[0] == 'No questions for the matrix in question "Question" on page "Page" found.\n' structure["Page"]["Question"]["questions"] = [] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No questions for the matrix in question 'Question' on page 'Page' found.\n" + assert not err + assert warn + assert det[0] == 'No questions for the matrix in question "Question" on page "Page" found.\n' structure["Page"]["Question"]["type"] = "Matrix" structure["Page"]["Question"]["text"] = "some text" structure["Page"]["Question"]["answers"] = "some answer" structure["Page"]["Question"]["randomize"] = False structure["Page"]["Question"].pop("questions") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No questions for the matrix in question 'Question' on page 'Page' found.\n" + assert not err + assert warn + assert det[0] == 'No questions for the matrix in question "Question" on page "Page" found.\n' structure["Page"]["Question"] = {'id': 'id'} # ------width------ structure["Page"]["Question"]["width"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid value for width for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Invalid value for width for question "Question" on page "Page".\n') structure["Page"]["Question"]["width"] = -20 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Width needs to be bigger than 0 for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Width needs to be bigger than 0 for question "Question" on page "Page".\n') structure["Page"]["Question"]["width"] = 300 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"].pop("width") structure["Page"]["Question"] = {'id': 'id'} @@ -1717,19 +1715,19 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["height"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid value for height for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Invalid value for height for question "Question" on page "Page".\n') structure["Page"]["Question"]["height"] = -20 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Height needs to be bigger than 0 for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Height needs to be bigger than 0 for question "Question" on page "Page".\n') structure["Page"]["Question"]["height"] = 300 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"].pop("height") structure["Page"]["Question"] = {'id': 'id'} @@ -1737,130 +1735,130 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["x_pos"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid value for x position for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Invalid value for x position for question "Question" on page "Page".\n') structure["Page"]["Question"]["x_pos"] = -20 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("X position needs to be bigger or equal to 0 for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('X position needs to be bigger or equal to 0 for question "Question" on page "Page".\n') structure["Page"]["Question"]["x_pos"] = 300 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"].pop("x_pos") structure["Page"]["Question"]["type"] = "Image" structure["Page"]["Question"]["image_file"] = "./test/Logo.png" structure["Page"]["Question"]["image_position"] = "free" structure["Page"]["Question"]["y_pos"] = 300 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No x position given for the question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No x position given for the question "Question" on page "Page".\n' structure["Page"]["Question"] = {'id': 'id'} # ------y_pos------ structure["Page"]["Question"]["y_pos"] = "ten" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid value for y position for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Invalid value for y position for question "Question" on page "Page".\n') structure["Page"]["Question"]["y_pos"] = -20 QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Y position needs to be bigger or equal to 0 for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Y position needs to be bigger or equal to 0 for question "Question" on page "Page".\n') structure["Page"]["Question"]["y_pos"] = 300 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"].pop("y_pos") structure["Page"]["Question"]["type"] = "Image" structure["Page"]["Question"]["image_file"] = "./test/Logo.png" structure["Page"]["Question"]["image_position"] = "free" structure["Page"]["Question"]["x_pos"] = 300 err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No y position given for the question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No y position given for the question "Question" on page "Page".\n' structure["Page"]["Question"] = {'id': 'id'} # ------image_file------ structure["Page"]["Question"]["image_file"] = "" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No image_file found for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No image_file found for question "Question" on page "Page".\n' structure["Page"]["Question"]["image_file"] = "./invalid/path.txt" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid image_file for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No valid image_file for question "Question" on page "Page".\n') structure["Page"]["Question"]["type"] = "Image" structure["Page"]["Question"]["image_position"] = "here" structure["Page"]["Question"].pop("image_file") err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "No image_file found for question 'Question' on page 'Page'.\n" + assert not err + assert warn + assert det[0] == 'No image_file found for question "Question" on page "Page".\n' structure["Page"]["Question"] = {'id': 'id'} # ------image_position------ structure["Page"]["Question"]["image_position"] = "everywhere" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid image position found for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('Invalid image position found for question "Question" on page "Page".\n') structure["Page"]["Question"]["image_position"] = "free" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "Image 'Question' on page 'Page' is chosen to be positioned freely, but no coordinates were given.\n" + assert not err + assert warn + assert det[0] == 'Image "Question" on page "Page" is chosen to be positioned freely, but no coordinates were given.\n' structure["Page"]["Question"]["type"] = "Image" structure["Page"]["Question"]["image_file"] = "./test/Logo.png" structure["Page"]["Question"].pop("image_position") QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No image_position found for question 'Question' on page 'Page'.\n") + assert err + assert not warn + assert -1 <= text.find('No image_position found for question "Question" on page "Page".\n') structure["Page"]["Question"] = {'id': 'id'} # ------receiver------ structure["Page"]["Question"]["receiver"] = ["ip", 3000] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid IP address given for the receiver in question 'Question' on page 'Page'.") > -1 + assert err + assert not warn + assert -1 <= text.find('No valid IP address given for the receiver in question "Question" on page "Page".') > -1 structure["Page"]["Question"]["receiver"] = ["", 3000] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No valid IP address given for the receiver in question 'Question' on page 'Page'.") > -1 + assert err + assert not warn + assert -1 <= text.find('No valid IP address given for the receiver in question "Question" on page "Page".') > -1 structure["Page"]["Question"]["receiver"] = ["127.0.0.1", ""] QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("Invalid receiver port in question 'Question' on page 'Page', couldn't be converted to a number 0-65535.") > -1 + assert err + assert not warn + assert -1 <= text.find('Invalid receiver port in question "Question" on page "Page", could not be converted to a number 0-65535.') > -1 structure["Page"]["Question"]["receiver"] = ["127.0.0.1", 800] err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"]["receiver"] = "audio" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("The receiver of question 'Question' on page 'Page' needs to have the format (IP, Port).") > -1 + assert err + assert not warn + assert -1 <= text.find('The receiver of question "Question" on page "Page" needs to have the format (IP, Port).') > -1 structure["Page"]["Question"].pop("receiver") structure["Page"]["Question"]["type"] = "OSCButton" structure["Page"]["Question"]["address"] = "/msg" @@ -1868,27 +1866,27 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["inscription"] = "Text" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No receiver found for question 'Question' on page 'Page'.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No receiver found for question "Question" on page "Page".\n') > -1 structure["Page"]["Question"] = {'id': 'id'} # ------address------ structure["Page"]["Question"]["address"] = "" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No OSC-address for question 'Question' on page 'Page' was given.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No OSC-address for question "Question" on page "Page" was given.\n') > -1 structure["Page"]["Question"]["address"] = "message" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == True - assert det[0] == "The OSC-address of question 'Question' on page 'Page' should start with '/'.\n" + assert not err + assert warn + assert det[0] == 'The OSC-address of question "Question" on page "Page" should start with "/".\n' structure["Page"]["Question"]["address"] = "/audio" err, warn, det = validate_questionnaire(structure, True) - assert err == False - assert warn == False + assert not err + assert not warn structure["Page"]["Question"].pop("address") structure["Page"]["Question"]["type"] = "OSCButton" structure["Page"]["Question"]["receiver"] = ["127.0.0.1", 8000] @@ -1896,9 +1894,9 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["inscription"] = "Text" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No OSC-address for question 'Question' on page 'Page' was given.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No OSC-address for question "Question" on page "Page" was given.\n') > -1 structure["Page"]["Question"] = {'id': 'id'} # ------value------ @@ -1908,9 +1906,9 @@ def test_question_settings(gui_init): structure["Page"]["Question"]["inscription"] = "Text" QTimer.singleShot(150, handle_dialog_error) err, warn, det = validate_questionnaire(structure, True) - assert err == True - assert warn == False - assert -1 <= text.find("No value for question 'Question' on page 'Page' was given.\n") > -1 + assert err + assert not warn + assert -1 <= text.find('No value for question "Question" on page "Page" was given.\n') > -1 structure["Page"]["Question"] = {'id': 'id'} gui_init.exit()