From 7b04d576056469f004a7c04362c493d70f51bbf4 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 25 Oct 2022 15:48:29 +0200 Subject: [PATCH] Refactor project settings test --- novelwriter/dialogs/projsettings.py | 8 +- .../guiProjSettings_Dialog_nwProject.nwx | 83 --- tests/test_dialogs/test_dlg_projsettings.py | 492 ++++++++++++------ tests/tools.py | 11 + 4 files changed, 351 insertions(+), 243 deletions(-) delete mode 100644 tests/reference/guiProjSettings_Dialog_nwProject.nwx diff --git a/novelwriter/dialogs/projsettings.py b/novelwriter/dialogs/projsettings.py index 5760d982..eb96ffb2 100644 --- a/novelwriter/dialogs/projsettings.py +++ b/novelwriter/dialogs/projsettings.py @@ -88,7 +88,7 @@ class GuiProjectSettings(PagedDialog): self.addControls(self.buttonBox) # Flags - self.spellChanged = False + self._spellChanged = False # Focus Tab self._focusTab(focusTab) @@ -97,6 +97,10 @@ class GuiProjectSettings(PagedDialog): return + @property + def spellChanged(self): + return self._spellChanged + ## # Slots ## @@ -116,7 +120,7 @@ class GuiProjectSettings(PagedDialog): self.theProject.setProjBackup(doBackup) # Remember this as updating spell dictionary can be expensive - self.spellChanged = self.theProject.setSpellLang(spellLang) + self._spellChanged = self.theProject.setSpellLang(spellLang) if self.tabStatus.colChanged: newList, delList = self.tabStatus.getNewList() diff --git a/tests/reference/guiProjSettings_Dialog_nwProject.nwx b/tests/reference/guiProjSettings_Dialog_nwProject.nwx deleted file mode 100644 index 307aae55..00000000 --- a/tests/reference/guiProjSettings_Dialog_nwProject.nwx +++ /dev/null @@ -1,83 +0,0 @@ - - - - Project Name - Project Title - Jane Doe - John Doh - 1 - 1 - 0 - - - True - None - False - en - None - None - None - None - 9 - 9 - 0 - - B - D - With This Stuff - - - %title% - %title% - %title% - * * * -
-
- - New - Note - Finished - Final - - - New - Minor - Major - Final - -
- - - - Novel - - - - Title Page - - - - New Chapter - - - - New Chapter - - - - New Scene - - - - Plot - - - - Characters - - - - World - - -
diff --git a/tests/test_dialogs/test_dlg_projsettings.py b/tests/test_dialogs/test_dlg_projsettings.py index d194229c..48e896bf 100644 --- a/tests/test_dialogs/test_dlg_projsettings.py +++ b/tests/test_dialogs/test_dlg_projsettings.py @@ -19,56 +19,46 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . """ -import os import pytest -from shutil import copyfile -from tools import cmpFiles, getGuiItem, buildTestProject +from novelwriter.enum import nwItemType +from tools import C, getGuiItem, buildTestProject from PyQt5.QtGui import QColor from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QDialog, QAction, QMessageBox, QColorDialog +from novelwriter.dialogs.editlabel import GuiEditLabel from novelwriter.dialogs.projsettings import GuiProjectSettings keyDelay = 2 typeDelay = 1 stepDelay = 20 -statusKeys = ["s000000", "s000001", "s000002", "s000003"] -importKeys = ["i000004", "i000005", "i000006", "i000007"] @pytest.mark.gui -def testDlgProjSettings_Dialog( - qtbot, monkeypatch, nwGUI, fncDir, fncProj, outDir, refDir, mockRnd -): - """Test the full project settings dialog. +def testDlgProjSettings_Dialog(qtbot, monkeypatch, nwGUI): + """Test the main dialog class. Saving settings is not tested in this + test, but are instead tested in the individual tab tests. """ - projFile = os.path.join(fncProj, "nwProject.nwx") - testFile = os.path.join(outDir, "guiProjSettings_Dialog_nwProject.nwx") - compFile = os.path.join(refDir, "guiProjSettings_Dialog_nwProject.nwx") - # Block message box monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Yes) + # Block the GUI blocking thread + monkeypatch.setattr(GuiProjectSettings, "exec_", lambda *a: None) + monkeypatch.setattr(GuiProjectSettings, "result", lambda *a: QDialog.Accepted) + monkeypatch.setattr(GuiProjectSettings, "spellChanged", lambda *a: True) + # Check that we cannot open when there is no project nwGUI.mainMenu.aProjectSettings.activate(QAction.Trigger) assert getGuiItem("GuiProjectSettings") is None - # Create new project - buildTestProject(nwGUI, fncProj) - nwGUI.mainConf.backupPath = fncDir - + # Pretend we have a project + nwGUI.hasProject = True nwGUI.theProject.setSpellLang("en") - nwGUI.theProject.setBookAuthors("Jane Smith\nJohn Smith") - nwGUI.theProject.setAutoReplace({"A": "B", "C": "D"}) # Get the dialog object - monkeypatch.setattr(GuiProjectSettings, "exec_", lambda *a: None) - monkeypatch.setattr(GuiProjectSettings, "result", lambda *a: QDialog.Accepted) - monkeypatch.setattr(nwGUI.docEditor.spEnchant, "listDictionaries", lambda: [("en", "none")]) - nwGUI.mainMenu.aProjectSettings.activate(QAction.Trigger) qtbot.waitUntil(lambda: getGuiItem("GuiProjectSettings") is not None, timeout=1000) @@ -77,83 +67,189 @@ def testDlgProjSettings_Dialog( projEdit.show() qtbot.addWidget(projEdit) + # Switch Tabs + projEdit._focusTab(GuiProjectSettings.TAB_REPLACE) + assert projEdit._tabBox.currentWidget() == projEdit.tabReplace + + projEdit._focusTab(GuiProjectSettings.TAB_IMPORT) + assert projEdit._tabBox.currentWidget() == projEdit.tabImport + + projEdit._focusTab(GuiProjectSettings.TAB_STATUS) + assert projEdit._tabBox.currentWidget() == projEdit.tabStatus + + projEdit._focusTab(GuiProjectSettings.TAB_MAIN) + assert projEdit._tabBox.currentWidget() == projEdit.tabMain + + # Clean Up + projEdit._doClose() + # qtbot.stop() + +# END Test testDlgProjSettings_Dialog + + +@pytest.mark.gui +def testDlgProjSettings_Main(qtbot, monkeypatch, nwGUI, fncDir, fncProj, mockRnd): + """Test the main tab of the project settings dialog. + """ + # Block message box + monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes) + monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Yes) + + # Mock components + monkeypatch.setattr(nwGUI.docEditor.spEnchant, "listDictionaries", lambda: [("en", "none")]) + + # Create new project + buildTestProject(nwGUI, fncProj) + mockRnd.reset() + nwGUI.mainConf.backupPath = fncDir + + # Set some values + theProject = nwGUI.theProject + theProject.setSpellLang("en") + theProject.setBookAuthors("Jane Smith\nJohn Smith") + theProject.setAutoReplace({"A": "B", "C": "D"}) + + # Create Dialog + projSettings = GuiProjectSettings(nwGUI, GuiProjectSettings.TAB_MAIN) + projSettings.show() + qtbot.addWidget(projSettings) + # Settings Tab # ============ - assert projEdit.tabMain.editName.text() == "New Project" - assert projEdit.tabMain.editTitle.text() == "New Novel" - assert projEdit.tabMain.editAuthors.toPlainText() == "Jane Smith\nJohn Smith" - assert projEdit.tabMain.spellLang.currentData() == "en" - assert projEdit.tabMain.doBackup.isChecked() is False + tabMain = projSettings.tabMain + + assert tabMain.editName.text() == "New Project" + assert tabMain.editTitle.text() == "New Novel" + assert tabMain.editAuthors.toPlainText() == "Jane Smith\nJohn Smith" + assert tabMain.spellLang.currentData() == "en" + assert tabMain.doBackup.isChecked() is False qtbot.wait(stepDelay) - projEdit.tabMain.editName.setText("") + tabMain.editName.setText("") for c in "Project Name": - qtbot.keyClick(projEdit.tabMain.editName, c, delay=typeDelay) - projEdit.tabMain.editTitle.setText("") + qtbot.keyClick(tabMain.editName, c, delay=typeDelay) + tabMain.editTitle.setText("") for c in "Project Title": - qtbot.keyClick(projEdit.tabMain.editTitle, c, delay=typeDelay) + qtbot.keyClick(tabMain.editTitle, c, delay=typeDelay) - projEdit.tabMain.editAuthors.clear() + tabMain.editAuthors.clear() for c in "Jane Doe": - qtbot.keyClick(projEdit.tabMain.editAuthors, c, delay=typeDelay) - qtbot.keyClick(projEdit.tabMain.editAuthors, Qt.Key_Return, delay=keyDelay) + qtbot.keyClick(tabMain.editAuthors, c, delay=typeDelay) + qtbot.keyClick(tabMain.editAuthors, Qt.Key_Return, delay=keyDelay) for c in "John Doh": - qtbot.keyClick(projEdit.tabMain.editAuthors, c, delay=typeDelay) - qtbot.keyClick(projEdit.tabMain.editAuthors, Qt.Key_Return, delay=keyDelay) + qtbot.keyClick(tabMain.editAuthors, c, delay=typeDelay) + qtbot.keyClick(tabMain.editAuthors, Qt.Key_Return, delay=keyDelay) qtbot.wait(stepDelay) - assert projEdit.tabMain.editName.text() == "Project Name" - assert projEdit.tabMain.editTitle.text() == "Project Title" - assert projEdit.tabMain.editAuthors.toPlainText() == "Jane Doe\nJohn Doh\n" + assert tabMain.editName.text() == "Project Name" + assert tabMain.editTitle.text() == "Project Title" + assert tabMain.editAuthors.toPlainText() == "Jane Doe\nJohn Doh\n" + assert projSettings.spellChanged is False + + projSettings._doSave() + assert theProject.projName == "Project Name" + assert theProject.bookTitle == "Project Title" + assert theProject.bookAuthors == ["Jane Doe", "John Doh"] + + # Clean up + projSettings._doClose() + # qtbot.stop() + +# END Test testDlgProjSettings_Main + + +@pytest.mark.gui +def testDlgProjSettings_StatusImport(qtbot, monkeypatch, nwGUI, fncDir, fncProj, mockRnd): + """Test the status and importance tabs of the project settings + dialog. + """ + # Block message box + monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes) + monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Yes) + monkeypatch.setattr(GuiEditLabel, "getLabel", lambda *a, text: (text, True)) + + # Mock components + monkeypatch.setattr(nwGUI.docEditor.spEnchant, "listDictionaries", lambda: [("en", "none")]) + + # Create new project + mockRnd.reset() + buildTestProject(nwGUI, fncProj) + nwGUI.mainConf.backupPath = fncDir + + # Set some values + theProject = nwGUI.theProject + theProject.tree[C.hTitlePage].setStatus(C.sFinished) + theProject.tree[C.hChapterDoc].setStatus(C.sDraft) + theProject.tree[C.hSceneDoc].setStatus(C.sDraft) + + nwGUI.projView.projTree.setSelectedHandle(C.hPlotRoot) + nwGUI.projView.projTree.newTreeItem(nwItemType.FILE, hLevel=1, isNote=True) + nwGUI.projView.projTree.setSelectedHandle(C.hCharRoot) + nwGUI.projView.projTree.newTreeItem(nwItemType.FILE, hLevel=1, isNote=True) + nwGUI.projView.projTree.setSelectedHandle(C.hWorldRoot) + nwGUI.projView.projTree.newTreeItem(nwItemType.FILE, hLevel=1, isNote=True) + + hPlotNote = "0000000000010" + hCharNote = "0000000000011" + hWorldNote = "0000000000012" + + theProject.tree[hPlotNote].setImport(C.iMajor) + theProject.tree[hCharNote].setImport(C.iMajor) + theProject.tree[hWorldNote].setImport(C.iMain) + + # Create Dialog + projSettings = GuiProjectSettings(nwGUI, GuiProjectSettings.TAB_STATUS) + projSettings.show() + qtbot.addWidget(projSettings) # Status Tab # ========== - projEdit._tabBox.setCurrentWidget(projEdit.tabStatus) + tabStatus = projSettings.tabStatus - assert projEdit.tabStatus.colChanged is False - assert projEdit.tabStatus.getNewList() == ([], []) - assert projEdit.tabStatus.listBox.topLevelItemCount() == 4 + assert tabStatus.colChanged is False + assert tabStatus.getNewList() == ([], []) + assert tabStatus.listBox.topLevelItemCount() == 4 # Can't delete the first item (it's in use) - projEdit.tabStatus.listBox.clearSelection() - projEdit.tabStatus.listBox.topLevelItem(0).setSelected(True) - qtbot.mouseClick(projEdit.tabStatus.delButton, Qt.LeftButton) - assert projEdit.tabStatus.listBox.topLevelItemCount() == 4 + tabStatus.listBox.clearSelection() + tabStatus.listBox.setCurrentItem(tabStatus.listBox.topLevelItem(0)) + qtbot.mouseClick(tabStatus.delButton, Qt.LeftButton) + assert tabStatus.listBox.topLevelItemCount() == 4 - # Can delete the third item - projEdit.tabStatus.listBox.clearSelection() - projEdit.tabStatus.listBox.topLevelItem(2).setSelected(True) - qtbot.mouseClick(projEdit.tabStatus.delButton, Qt.LeftButton) - assert projEdit.tabStatus.listBox.topLevelItemCount() == 3 + # Can delete the second item + tabStatus.listBox.clearSelection() + tabStatus.listBox.setCurrentItem(tabStatus.listBox.topLevelItem(1)) + qtbot.mouseClick(tabStatus.delButton, Qt.LeftButton) + assert tabStatus.listBox.topLevelItemCount() == 3 # Add a new item - monkeypatch.setattr(QColorDialog, "getColor", lambda *a: QColor(20, 30, 40)) - qtbot.mouseClick(projEdit.tabStatus.addButton, Qt.LeftButton) - projEdit.tabStatus.listBox.topLevelItem(3).setSelected(True) - for n in range(8): - qtbot.keyClick(projEdit.tabStatus.editName, Qt.Key_Backspace, delay=typeDelay) - for c in "Final": - qtbot.keyClick(projEdit.tabStatus.editName, c, delay=typeDelay) - qtbot.mouseClick(projEdit.tabStatus.colButton, Qt.LeftButton) - qtbot.mouseClick(projEdit.tabStatus.saveButton, Qt.LeftButton) - assert projEdit.tabStatus.listBox.topLevelItemCount() == 4 - qtbot.wait(stepDelay) + with monkeypatch.context() as mp: + mp.setattr(QColorDialog, "getColor", lambda *a: QColor(20, 30, 40)) + qtbot.mouseClick(tabStatus.addButton, Qt.LeftButton) + tabStatus.listBox.setCurrentItem(tabStatus.listBox.topLevelItem(3)) + for _ in range(8): + qtbot.keyClick(tabStatus.editName, Qt.Key_Backspace, delay=typeDelay) + for c in "Final": + qtbot.keyClick(tabStatus.editName, c, delay=typeDelay) + qtbot.mouseClick(tabStatus.colButton, Qt.LeftButton) + qtbot.mouseClick(tabStatus.saveButton, Qt.LeftButton) + assert tabStatus.listBox.topLevelItemCount() == 4 - assert projEdit.tabStatus.colChanged is True - assert projEdit.tabStatus.getNewList() == ( + assert tabStatus.colChanged is True + assert tabStatus.getNewList() == ( [ { - "key": statusKeys[0], + "key": C.sNew, "name": "New", "cols": (100, 100, 100) }, { - "key": statusKeys[1], - "name": "Note", - "cols": (200, 50, 0) + "key": C.sDraft, + "name": "Draft", + "cols": (200, 150, 0) }, { - "key": statusKeys[3], + "key": C.sFinished, "name": "Finished", "cols": (50, 200, 0) }, { @@ -162,121 +258,201 @@ def testDlgProjSettings_Dialog( "cols": (20, 30, 40) } ], [ - statusKeys[2] # Deleted item + C.sNote # Deleted item ] ) - # Move items - projEdit.tabStatus.listBox.clearSelection() - projEdit.tabStatus._moveItem(1) - assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [ - statusKeys[0], statusKeys[1], statusKeys[3], None + # Move items, none selected -> no change + tabStatus.listBox.clearSelection() + tabStatus._moveItem(1) + assert [x["key"] for x in tabStatus.getNewList()[0]] == [ + C.sNew, C.sDraft, C.sFinished, None ] - projEdit.tabStatus.listBox.clearSelection() - projEdit.tabStatus.listBox.topLevelItem(0).setSelected(True) - projEdit.tabStatus._moveItem(-1) - assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [ - statusKeys[0], statusKeys[1], statusKeys[3], None + # Move items, first selected, move up -> no change + tabStatus.listBox.clearSelection() + tabStatus.listBox.setCurrentItem(tabStatus.listBox.topLevelItem(0)) + tabStatus._moveItem(-1) + assert [x["key"] for x in tabStatus.getNewList()[0]] == [ + C.sNew, C.sDraft, C.sFinished, None ] - projEdit.tabStatus.listBox.clearSelection() - projEdit.tabStatus.listBox.topLevelItem(3).setSelected(True) - projEdit.tabStatus._moveItem(-1) - assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [ - statusKeys[0], statusKeys[1], None, statusKeys[3] + # Move items, last selected, move up -> allowed + tabStatus.listBox.clearSelection() + tabStatus.listBox.setCurrentItem(tabStatus.listBox.topLevelItem(3)) + tabStatus._moveItem(-1) + assert [x["key"] for x in tabStatus.getNewList()[0]] == [ + C.sNew, C.sDraft, None, C.sFinished ] - projEdit.tabStatus._moveItem(1) - assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [ - statusKeys[0], statusKeys[1], statusKeys[3], None + + # Move items, same selected, move down -> allowed + tabStatus._moveItem(1) + assert [x["key"] for x in tabStatus.getNewList()[0]] == [ + C.sNew, C.sDraft, C.sFinished, None ] # Importance Tab # ============== - projEdit._tabBox.setCurrentWidget(projEdit.tabImport) - projEdit.tabStatus.listBox.clearSelection() - projEdit.tabImport.listBox.topLevelItem(3).setSelected(True) - qtbot.mouseClick(projEdit.tabImport.delButton, Qt.LeftButton) - qtbot.mouseClick(projEdit.tabImport.addButton, Qt.LeftButton) - projEdit.tabStatus.listBox.clearSelection() - projEdit.tabImport.listBox.topLevelItem(3).setSelected(True) - for n in range(8): - qtbot.keyClick(projEdit.tabImport.editName, Qt.Key_Backspace, delay=typeDelay) - for c in "Final": - qtbot.keyClick(projEdit.tabImport.editName, c, delay=typeDelay) - qtbot.mouseClick(projEdit.tabImport.saveButton, Qt.LeftButton) - qtbot.wait(stepDelay) + tabImport = projSettings.tabImport + projSettings._focusTab(GuiProjectSettings.TAB_IMPORT) + + # Delete unused entry + tabImport.listBox.clearSelection() + tabImport.listBox.setCurrentItem(tabImport.listBox.topLevelItem(1)) + qtbot.mouseClick(tabImport.delButton, Qt.LeftButton) + assert tabImport.listBox.topLevelItemCount() == 3 + + # Add a new entry + with monkeypatch.context() as mp: + mp.setattr(QColorDialog, "getColor", lambda *a: QColor(20, 30, 40)) + qtbot.mouseClick(tabImport.addButton, Qt.LeftButton) + tabImport.listBox.clearSelection() + tabImport.listBox.setCurrentItem(tabImport.listBox.topLevelItem(3)) + for _ in range(8): + qtbot.keyClick(tabImport.editName, Qt.Key_Backspace, delay=typeDelay) + for c in "Final": + qtbot.keyClick(tabImport.editName, c, delay=typeDelay) + qtbot.mouseClick(tabImport.colButton, Qt.LeftButton) + qtbot.mouseClick(tabImport.saveButton, Qt.LeftButton) + assert tabImport.listBox.topLevelItemCount() == 4 + + assert tabImport.colChanged is True + assert tabImport.getNewList() == ( + [ + { + "key": C.iNew, + "name": "New", + "cols": (100, 100, 100) + }, { + "key": C.iMajor, + "name": "Major", + "cols": (200, 150, 0) + }, { + "key": C.iMain, + "name": "Main", + "cols": (50, 200, 0) + }, { + "key": None, + "name": "Final", + "cols": (20, 30, 40) + } + ], [ + C.iMinor # Deleted item + ] + ) + + # Check Project + projSettings._doSave() + + statusItems = dict(theProject.statusItems.items()) + assert statusItems[C.sNew]["name"] == "New" + assert statusItems[C.sDraft]["name"] == "Draft" + assert statusItems[C.sFinished]["name"] == "Finished" + assert statusItems["s000013"]["name"] == "Final" + + importItems = dict(theProject.importItems.items()) + assert importItems[C.iNew]["name"] == "New" + assert importItems[C.iMajor]["name"] == "Major" + assert importItems[C.iMain]["name"] == "Main" + assert importItems["i000014"]["name"] == "Final" + + # Clean up + # qtbot.stop() + projSettings._doClose() + +# END Test testDlgProjSettings_StatusImport + + +@pytest.mark.gui +def testDlgProjSettings_Replace(qtbot, monkeypatch, nwGUI, fncDir, fncProj, mockRnd): + """Test the auto-replace tab of the project settings dialog. + """ + # Block message box + monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes) + monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Yes) + monkeypatch.setattr(GuiEditLabel, "getLabel", lambda *a, text: (text, True)) + + # Mock components + monkeypatch.setattr(nwGUI.docEditor.spEnchant, "listDictionaries", lambda: [("en", "none")]) + + # Create new project + mockRnd.reset() + buildTestProject(nwGUI, fncProj) + nwGUI.mainConf.backupPath = fncDir + + # Set some values + theProject = nwGUI.theProject + theProject.autoReplace = { + "A": "B", "C": "D" + } + + # Create Dialog + projSettings = GuiProjectSettings(nwGUI, GuiProjectSettings.TAB_REPLACE) + projSettings.show() + qtbot.addWidget(projSettings) # Auto-Replace Tab # ================ - qtbot.wait(stepDelay) - projEdit._tabBox.setCurrentWidget(projEdit.tabReplace) + tabReplace = projSettings.tabReplace - assert projEdit.tabReplace.listBox.topLevelItem(0).text(0) == "" - assert projEdit.tabReplace.listBox.topLevelItem(0).text(1) == "B" - assert projEdit.tabReplace.listBox.topLevelItem(1).text(0) == "" - assert projEdit.tabReplace.listBox.topLevelItem(1).text(1) == "D" + assert tabReplace.listBox.topLevelItem(0).text(0) == "" + assert tabReplace.listBox.topLevelItem(0).text(1) == "B" + assert tabReplace.listBox.topLevelItem(1).text(0) == "" + assert tabReplace.listBox.topLevelItem(1).text(1) == "D" + assert tabReplace.listBox.topLevelItemCount() == 2 - qtbot.mouseClick(projEdit.tabReplace.addButton, Qt.LeftButton) - projEdit.tabReplace.listBox.topLevelItem(2).setSelected(True) - projEdit.tabReplace.editKey.setText("") + # Nothing to save or delete + tabReplace.listBox.clearSelection() + assert tabReplace._saveEntry() is False + assert tabReplace._delEntry() is False + assert tabReplace.listBox.topLevelItemCount() == 2 + + # Create a new entry + qtbot.mouseClick(tabReplace.addButton, Qt.LeftButton) + assert tabReplace.listBox.topLevelItemCount() == 3 + assert tabReplace.listBox.topLevelItem(2).text(0) == "" + assert tabReplace.listBox.topLevelItem(2).text(1) == "" + + # Edit the entry + tabReplace.listBox.setCurrentItem(tabReplace.listBox.topLevelItem(2)) + tabReplace.editKey.setText("") for c in "Th is ": - qtbot.keyClick(projEdit.tabReplace.editKey, c, delay=typeDelay) - projEdit.tabReplace.editValue.setText("") + qtbot.keyClick(tabReplace.editKey, c, delay=typeDelay) + tabReplace.editValue.setText("") for c in "With This Stuff ": - qtbot.keyClick(projEdit.tabReplace.editValue, c, delay=typeDelay) - qtbot.mouseClick(projEdit.tabReplace.saveButton, Qt.LeftButton) + qtbot.keyClick(tabReplace.editValue, c, delay=typeDelay) + qtbot.mouseClick(tabReplace.saveButton, Qt.LeftButton) + assert tabReplace.listBox.topLevelItem(2).text(0) == "" + assert tabReplace.listBox.topLevelItem(2).text(1) == "With This Stuff " - qtbot.wait(stepDelay) - projEdit.tabReplace.listBox.clearSelection() - assert not projEdit.tabReplace._saveEntry() - assert not projEdit.tabReplace._delEntry() - qtbot.mouseClick(projEdit.tabReplace.addButton, Qt.LeftButton) + # Create a new entry again + tabReplace.listBox.clearSelection() + qtbot.mouseClick(tabReplace.addButton, Qt.LeftButton) + assert tabReplace.listBox.topLevelItemCount() == 4 + # The list is sorted, so we must find it newIdx = -1 - for i in range(projEdit.tabReplace.listBox.topLevelItemCount()): - if projEdit.tabReplace.listBox.topLevelItem(i).text(0) == "": + for i in range(tabReplace.listBox.topLevelItemCount()): + if tabReplace.listBox.topLevelItem(i).text(0) == "": newIdx = i break - assert newIdx >= 0 - newItem = projEdit.tabReplace.listBox.topLevelItem(newIdx) - projEdit.tabReplace.listBox.setCurrentItem(newItem) - qtbot.mouseClick(projEdit.tabReplace.delButton, Qt.LeftButton) - qtbot.wait(stepDelay) - # Save & Check - # ============ + # Then delete the new item + tabReplace.listBox.setCurrentItem(tabReplace.listBox.topLevelItem(newIdx)) + qtbot.mouseClick(tabReplace.delButton, Qt.LeftButton) + assert tabReplace.listBox.topLevelItemCount() == 3 - projEdit._doSave() + # Check Project + projSettings._doSave() + assert theProject.autoReplace == { + "A": "B", "C": "D", "This": "With This Stuff" + } - # Open again, and check project settings - nwGUI.mainMenu.aProjectSettings.activate(QAction.Trigger) - qtbot.waitUntil(lambda: getGuiItem("GuiProjectSettings") is not None, timeout=1000) + # Clean up + # qtbot.stop() + projSettings._doClose() - projEdit = getGuiItem("GuiProjectSettings") - assert isinstance(projEdit, GuiProjectSettings) - - qtbot.addWidget(projEdit) - assert projEdit.tabMain.editName.text() == "Project Name" - assert projEdit.tabMain.editTitle.text() == "Project Title" - theAuth = projEdit.tabMain.editAuthors.toPlainText().strip().splitlines() - assert len(theAuth) == 2 - assert theAuth[0] == "Jane Doe" - assert theAuth[1] == "John Doh" - - projEdit._doClose() - qtbot.wait(stepDelay) - - assert nwGUI.saveProject() - qtbot.wait(stepDelay) - - # Check the files - copyfile(projFile, testFile) - assert cmpFiles(testFile, compFile, [2, 8, 9, 10]) - - # qtbot.stopForInteraction() - -# END Test testDlgProjSettings_Dialog +# END Test testDlgProjSettings_Replace diff --git a/tests/tools.py b/tests/tools.py index 4744d472..4a97c930 100644 --- a/tests/tools.py +++ b/tests/tools.py @@ -30,6 +30,17 @@ XML_IGNORE = ("