diff --git a/tests/test_core/test_core_docbuild.py b/tests/test_core/test_core_docbuild.py index 466716cf..634d6e92 100644 --- a/tests/test_core/test_core_docbuild.py +++ b/tests/test_core/test_core_docbuild.py @@ -86,8 +86,12 @@ def testCoreDocBuild_OpenDocument(monkeypatch, mockGUI, prjLipsum, fncPath, tstP docBuild = NWBuildDocument(project, build) docBuild.setCountEnabled(True) + docBuild.setBuildOutline(True) docBuild.queueAll() + assert docBuild._count is True + assert docBuild._outline is True + assert len(docBuild) == 21 # Check FODT Build diff --git a/tests/test_core/test_core_tokenizer.py b/tests/test_core/test_core_tokenizer.py index a35fa2e0..beba03f0 100644 --- a/tests/test_core/test_core_tokenizer.py +++ b/tests/test_core/test_core_tokenizer.py @@ -1498,6 +1498,73 @@ def testCoreToken_ProcessHeaders(mockGUI): # END Test testCoreToken_ProcessHeaders +@pytest.mark.core +def testCoreToken_BuildOutline(mockGUI, ipsumText): + """Test stats counter of the Tokenizer class.""" + project = NWProject() + project.data.setLanguage("en") + project._loadProjectLocalisation() + tokens = BareTokenizer(project) + + # Novel + tokens._isNovel = True + tokens._handle = "0000000000000" + tokens._text = ( + "#! My Novel\n\n" + "# Part One\n\n" + "## Chapter One\n\n" + "### Scene One\n\n" + "Text\n\n" + "### Scene Two\n\n" + "Text\n\n" + "## Chapter Two\n\n" + "### Scene Three\n\n" + "Text\n\n" + "###! Scene Four\n\n" + "Text\n\n" + "#### Section\n\n" + "Text\n\n" + ) + tokens.tokenizeText() + tokens.buildOutline() + + # Note + tokens._isNovel = False + tokens._handle = "0000000000001" + tokens._text = ( + "#! My Notes\n\n" + "# Header 1\n\n" + "Text\n\n" + "## Header 2\n\n" + "Text\n\n" + "### Header 3\n\n" + "Text\n\n" + "#### Header 4\n\n" + "Text\n\n" + ) + tokens.tokenizeText() + tokens.buildOutline() + + # Check Outline + assert tokens.textOutline == { + "0000000000000:T0001": "TT|My Novel", + "0000000000000:T0002": "PT|Part One", + "0000000000000:T0003": "CH|Chapter One", + "0000000000000:T0004": "SC|Scene One", + "0000000000000:T0005": "SC|Scene Two", + "0000000000000:T0006": "CH|Chapter Two", + "0000000000000:T0007": "SC|Scene Three", + "0000000000000:T0008": "SC|Scene Four", + "0000000000001:T0001": "TT|My Notes", + "0000000000001:T0002": "H1|Header 1", + "0000000000001:T0003": "H2|Header 2", + "0000000000001:T0004": "H3|Header 3", + } + + +# END Test testCoreToken_BuildOutline + + @pytest.mark.core def testCoreToken_CountStats(mockGUI, ipsumText): """Test stats counter of the Tokenizer class.""" diff --git a/tests/test_tools/test_tools_manuscript.py b/tests/test_tools/test_tools_manuscript.py index b6c5df66..635fb174 100644 --- a/tests/test_tools/test_tools_manuscript.py +++ b/tests/test_tools/test_tools_manuscript.py @@ -26,11 +26,12 @@ import pytest from pathlib import Path from pytestqt.qtbot import QtBot +from novelwriter.constants import nwHeadFmt from tools import C, buildTestProject from mocked import causeOSError from PyQt5.QtCore import Qt, pyqtSlot -from PyQt5.QtWidgets import QAction, QDialogButtonBox +from PyQt5.QtWidgets import QAction, QDialogButtonBox, QListWidgetItem from PyQt5.QtPrintSupport import QPrintPreviewDialog from novelwriter import CONFIG, SHARED @@ -152,11 +153,31 @@ def testManuscript_Builds(qtbot: QtBot, nwGUI: GuiMain, projPath: Path): @pytest.mark.gui -def testManuscript_Features(monkeypatch, qtbot: QtBot, nwGUI: GuiMain, projPath: Path): +def testManuscript_Features(monkeypatch, qtbot, nwGUI, projPath, mockRnd): """Test other features of the GuiManuscript dialog.""" buildTestProject(nwGUI, projPath) nwGUI.openProject(projPath) + nwGUI.openDocument(C.hTitlePage) + nwGUI.docEditor.setPlainText( + "#! My Novel\n\n" + "# Part One\n\n" + "## Chapter One\n\n" + "### Scene One\n\n" + "Text\n\n" + "### Scene Two\n\n" + "Text\n\n" + "## Chapter Two\n\n" + "### Scene Three\n\n" + "Text\n\n" + "###! Scene Four\n\n" + "Text\n\n" + "#### Section\n\n" + "Text\n\n" + ) + nwGUI.saveDocument() + # qtbot.stop() + manus = GuiManuscript(nwGUI) manus.show() manus.loadContent() @@ -185,6 +206,14 @@ def testManuscript_Features(monkeypatch, qtbot: QtBot, nwGUI: GuiMain, projPath: manus.btnPreview.click() assert cacheFile.exists() is False + first = manus.buildList.item(0) + assert isinstance(first, QListWidgetItem) + build = manus._builds.getBuild(first.data(GuiManuscript.D_KEY)) + assert isinstance(build, BuildSettings) + build.setValue("headings.fmtScene", nwHeadFmt.TITLE) + build.setValue("headings.fmtHardScene", nwHeadFmt.TITLE) + manus._builds.setBuild(build) + # Preview again, and allow cache file to be created manus.buildList.setCurrentRow(0) with qtbot.waitSignal(manus.docPreview.document().contentsChanged): @@ -192,15 +221,45 @@ def testManuscript_Features(monkeypatch, qtbot: QtBot, nwGUI: GuiMain, projPath: assert manus.docPreview.toPlainText().strip() != "" assert cacheFile.exists() is True + # Check Outline + assert manus.buildOutline._outline == { + "000000000000c:T0001": "TT|My Novel", + "000000000000c:T0002": "PT|Part One", + "000000000000c:T0003": "CH|Chapter One", + "000000000000c:T0004": "SC|Scene One", + "000000000000c:T0005": "SC|Scene Two", + "000000000000c:T0006": "CH|Chapter Two", + "000000000000c:T0007": "SC|Scene Three", + "000000000000c:T0008": "SC|Scene Four", + "000000000000e:T0001": "CH|New Chapter", + "000000000000f:T0001": "SC|New Scene", + } + listView = manus.buildOutline.listView + assert listView.topLevelItemCount() == 5 + keyRole = manus.buildOutline.D_LINE + + assert (item := listView.topLevelItem(0)) and item.data(0, keyRole) == "000000000000c:T0001" + assert (item := listView.topLevelItem(1)) and item.data(0, keyRole) == "000000000000c:T0002" + assert (item := listView.topLevelItem(2)) and item.data(0, keyRole) == "000000000000c:T0003" + assert (item := listView.topLevelItem(3)) and item.data(0, keyRole) == "000000000000c:T0006" + assert (item := listView.topLevelItem(4)) and item.data(0, keyRole) == "000000000000e:T0001" + + # Click Outline + item = listView.topLevelItem(4) + assert item is not None + with qtbot.waitSignal(manus.buildOutline.outlineEntryClicked) as signal: + manus.buildOutline._onItemClick(item) + assert signal.args == ["000000000000e:T0001"] + # Check Preview Stats assert manus.docStats.mainStack.currentWidget() == manus.docStats.minWidget - assert manus.docStats.minWordCount.text() == "7" - assert manus.docStats.minCharCount.text() == "31" + assert manus.docStats.minWordCount.text() == "25" + assert manus.docStats.minCharCount.text() == "117" manus.docStats.toggleButton.toggle() assert manus.docStats.mainStack.currentWidget() == manus.docStats.maxWidget - assert manus.docStats.maxTotalWords.text() == "7" - assert manus.docStats.maxTotalChars.text() == "31" + assert manus.docStats.maxTotalWords.text() == "25" + assert manus.docStats.maxTotalChars.text() == "117" # Toggle justify assert manus.docPreview.document().defaultTextOption().alignment() == Qt.AlignAbsolute