--- a/eric7/PyUnit/UnittestDialog.py Wed Aug 25 17:44:36 2021 +0200 +++ b/eric7/PyUnit/UnittestDialog.py Thu Aug 26 18:08:46 2021 +0200 @@ -14,7 +14,7 @@ import os import contextlib -from PyQt6.QtCore import pyqtSignal, QEvent, Qt, pyqtSlot +from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QEvent, QFileInfo from PyQt6.QtGui import QColor from PyQt6.QtWidgets import ( QWidget, QDialog, QApplication, QDialogButtonBox, QListWidgetItem, @@ -32,6 +32,11 @@ import Preferences +from Globals import ( + recentNameUnittestDiscoverHistory, recentNameUnittestFileHistory, + recentNameUnittestTestnameHistory +) + class UnittestDialog(QWidget, Ui_UnittestDialog): """ @@ -77,6 +82,9 @@ self.setObjectName(name) self.setupUi(self) + self.clearHistoriesButton.setIcon( + UI.PixmapCache.getIcon("clearPrivateData")) + self.testsuitePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE) self.testsuitePicker.setInsertPolicy( QComboBox.InsertPolicy.InsertAtTop) @@ -89,6 +97,8 @@ self.discoveryPicker.setSizeAdjustPolicy( QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon) + self.testComboBox.lineEdit().setClearButtonEnabled(True) + self.discoverButton = self.buttonBox.addButton( self.tr("Discover"), QDialogButtonBox.ButtonRole.ActionRole) self.discoverButton.setToolTip(self.tr( @@ -98,11 +108,13 @@ """<p>This button starts a discovery of available tests.</p>""")) self.startButton = self.buttonBox.addButton( self.tr("Start"), QDialogButtonBox.ButtonRole.ActionRole) + self.startButton.setToolTip(self.tr( "Start the selected testsuite")) self.startButton.setWhatsThis(self.tr( """<b>Start Test</b>""" """<p>This button starts the selected testsuite.</p>""")) + self.startFailedButton = self.buttonBox.addButton( self.tr("Rerun Failed"), QDialogButtonBox.ButtonRole.ActionRole) self.startFailedButton.setToolTip( @@ -111,12 +123,14 @@ """<b>Rerun Failed</b>""" """<p>This button reruns all failed tests of the selected""" """ testsuite.</p>""")) + self.stopButton = self.buttonBox.addButton( self.tr("Stop"), QDialogButtonBox.ButtonRole.ActionRole) self.stopButton.setToolTip(self.tr("Stop the running unittest")) self.stopButton.setWhatsThis(self.tr( """<b>Stop Test</b>""" """<p>This button stops a running unittest.</p>""")) + self.discoverButton.setEnabled(False) self.stopButton.setEnabled(False) self.startButton.setDefault(True) @@ -163,8 +177,6 @@ self.savedModulelist = None self.savedSysPath = sys.path self.savedCwd = os.getcwd() - if prog: - self.insertProg(prog) self.rxPatterns = [ self.tr("^Failure: "), @@ -191,6 +203,13 @@ self.testSucceededUnexpected) self.__editors = [] + + self.__loadRecent() + + self.insertProg(prog) + self.insertTestName("") + + self.clearHistoriesButton.clicked.connect(self.clearRecent) def keyPressEvent(self, evt): """ @@ -251,6 +270,8 @@ @param start start directory name to be inserted @type str """ + current = self.discoveryPicker.currentText() + # prepend the given directory to the discovery picker if start is None: start = "" @@ -259,6 +280,9 @@ self.discoverHistory.insert(0, start) self.discoveryPicker.clear() self.discoveryPicker.addItems(self.discoverHistory) + + if current: + self.discoveryPicker.setText(current) def insertProg(self, prog): """ @@ -267,6 +291,8 @@ @param prog filename to be inserted (string) """ + current = self.testsuitePicker.currentText() + # prepend the selected file to the testsuite picker if prog is None: prog = "" @@ -275,6 +301,9 @@ self.fileHistory.insert(0, prog) self.testsuitePicker.clear() self.testsuitePicker.addItems(self.fileHistory) + + if current: + self.testsuitePicker.setText(current) def insertTestName(self, testName): """ @@ -282,6 +311,8 @@ @param testName name of the test to be inserted (string) """ + current = self.testComboBox.currentText() + # prepend the selected file to the testsuite combobox if testName is None: testName = "" @@ -290,6 +321,9 @@ self.testNameHistory.insert(0, testName) self.testComboBox.clear() self.testComboBox.addItems(self.testNameHistory) + + if current: + self.testComboBox.setCurrentText(current) @pyqtSlot() def on_testsuitePicker_aboutToShowPathPickerDialog(self): @@ -365,13 +399,83 @@ """ if button == self.discoverButton: self.__discover() + self.__saveRecent() elif button == self.startButton: self.startTests() + self.__saveRecent() elif button == self.stopButton: self.__stopTests() elif button == self.startFailedButton: self.startTests(failedOnly=True) + def __loadRecent(self): + """ + Private method to load the most recently used lists. + """ + Preferences.Prefs.rsettings.sync() + + # 1. discovery history + self.discoverHistory = [] + rs = Preferences.Prefs.rsettings.value( + recentNameUnittestDiscoverHistory) + if rs is not None: + recent = [f + for f in Preferences.toList(rs) + if QFileInfo(f).exists()] + self.discoverHistory = recent[ + :Preferences.getDebugger("RecentNumber")] + + # 2. test file history + self.fileHistory = [] + rs = Preferences.Prefs.rsettings.value( + recentNameUnittestFileHistory) + if rs is not None: + recent = [f + for f in Preferences.toList(rs) + if QFileInfo(f).exists()] + self.fileHistory = recent[ + :Preferences.getDebugger("RecentNumber")] + + # 3. test name history + self.testNameHistory = [] + rs = Preferences.Prefs.rsettings.value( + recentNameUnittestTestnameHistory) + if rs is not None: + recent = [n for n in Preferences.toList(rs) if n] + self.testNameHistory = recent[ + :Preferences.getDebugger("RecentNumber")] + + def __saveRecent(self): + """ + Private method to save the most recently used lists. + """ + Preferences.Prefs.rsettings.setValue( + recentNameUnittestDiscoverHistory, self.discoverHistory) + Preferences.Prefs.rsettings.setValue( + recentNameUnittestFileHistory, self.fileHistory) + Preferences.Prefs.rsettings.setValue( + recentNameUnittestTestnameHistory, self.testNameHistory) + + Preferences.Prefs.rsettings.sync() + + @pyqtSlot() + def clearRecent(self): + """ + Public slot to clear the recently used lists. + """ + # clear histories + self.discoverHistory = [] + self.fileHistory = [] + self.testNameHistory = [] + + # clear widgets with histories + self.discoveryPicker.clear() + self.testsuitePicker.clear() + self.testComboBox.clear() + + # sync histories + self.__saveRecent() + @pyqtSlot() def __discover(self): """ @@ -383,6 +487,7 @@ self.discoveryList.clear() discoveryStart = self.discoveryPicker.currentText() + self.insertDiscovery(discoveryStart) self.sbLabel.setText(self.tr("Discovering Tests")) QApplication.processEvents() @@ -677,6 +782,9 @@ discoveryStart = self.discoveryPicker.currentText() testFileName = "" testName = "" + + if discoveryStart: + self.insertDiscovery(discoveryStart) else: discoveryStart = "" testFileName = self.testsuitePicker.currentText() @@ -1382,3 +1490,17 @@ return True return False + + +def clearSavedHistories(self): + """ + Function to clear the saved history lists. + """ + Preferences.Prefs.rsettings.setValue( + recentNameUnittestDiscoverHistory, []) + Preferences.Prefs.rsettings.setValue( + recentNameUnittestFileHistory, []) + Preferences.Prefs.rsettings.setValue( + recentNameUnittestTestnameHistory, []) + + Preferences.Prefs.rsettings.sync()