Add test coverage of splitter function in project tree
This commit is contained in:
@@ -27,9 +27,7 @@ from shutil import copyfile
|
|||||||
from mock import causeOSError
|
from mock import causeOSError
|
||||||
from tools import C, buildTestProject, cmpFiles
|
from tools import C, buildTestProject, cmpFiles
|
||||||
|
|
||||||
from novelwriter.core.project import NWProject
|
from novelwriter.core import NWProject, DocMerger, DocSplitter, NWDoc
|
||||||
from novelwriter.core.doctools import DocMerger, DocSplitter
|
|
||||||
from novelwriter.core.document import NWDoc
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.core
|
@pytest.mark.core
|
||||||
|
|||||||
@@ -45,22 +45,17 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
|
|||||||
|
|
||||||
docText = (
|
docText = (
|
||||||
"Text\n\n"
|
"Text\n\n"
|
||||||
"##! Prologue\n\n"
|
"##! Prologue\n\nText\n\n"
|
||||||
"Text\n\n"
|
"## Chapter One\n\nText\n\n"
|
||||||
"## Chapter One\n\n"
|
"### Scene One\n\nText\n\n"
|
||||||
"### Scene One\n\n"
|
"### Scene Two\n\nText\n\n"
|
||||||
"Text\n\n"
|
"## Chapter Two\n\nText\n\n"
|
||||||
"### Scene Two\n\n"
|
"### Scene Three\n\nText\n\n"
|
||||||
"Text\n\n"
|
"### Scene Four\n\nText\n\n"
|
||||||
"## Chapter Two\n\n"
|
"#! New Title\n\nText\n\n"
|
||||||
"### Scene Three\n\n"
|
"## New Chapter\n\nText\n\n"
|
||||||
"Text\n\n"
|
"### New Scene\n\nText\n\n"
|
||||||
"### Scene Four\n\n"
|
"#### New Section\n\nText\n\n"
|
||||||
"Text\n\n"
|
|
||||||
"#! New Title\n\n"
|
|
||||||
"## New Chapter\n\n"
|
|
||||||
"### New Scene\n\n"
|
|
||||||
"#### New Section\n\n"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
hSplitDoc = theProject.newFile("Split Doc", C.hNovelRoot)
|
hSplitDoc = theProject.newFile("Split Doc", C.hNovelRoot)
|
||||||
@@ -90,15 +85,15 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
|
|||||||
assert data["headerList"][0] == (0, 1, "Split Doc")
|
assert data["headerList"][0] == (0, 1, "Split Doc")
|
||||||
assert data["headerList"][1] == (4, 2, "Prologue")
|
assert data["headerList"][1] == (4, 2, "Prologue")
|
||||||
assert data["headerList"][2] == (8, 2, "Chapter One")
|
assert data["headerList"][2] == (8, 2, "Chapter One")
|
||||||
assert data["headerList"][3] == (10, 3, "Scene One")
|
assert data["headerList"][3] == (12, 3, "Scene One")
|
||||||
assert data["headerList"][4] == (14, 3, "Scene Two")
|
assert data["headerList"][4] == (16, 3, "Scene Two")
|
||||||
assert data["headerList"][5] == (18, 2, "Chapter Two")
|
assert data["headerList"][5] == (20, 2, "Chapter Two")
|
||||||
assert data["headerList"][6] == (20, 3, "Scene Three")
|
assert data["headerList"][6] == (24, 3, "Scene Three")
|
||||||
assert data["headerList"][7] == (24, 3, "Scene Four")
|
assert data["headerList"][7] == (28, 3, "Scene Four")
|
||||||
assert data["headerList"][8] == (28, 1, "New Title")
|
assert data["headerList"][8] == (32, 1, "New Title")
|
||||||
assert data["headerList"][9] == (30, 2, "New Chapter")
|
assert data["headerList"][9] == (36, 2, "New Chapter")
|
||||||
assert data["headerList"][10] == (32, 3, "New Scene")
|
assert data["headerList"][10] == (40, 3, "New Scene")
|
||||||
assert data["headerList"][11] == (34, 4, "New Section")
|
assert data["headerList"][11] == (44, 4, "New Section")
|
||||||
|
|
||||||
# Loading the dialog on a non-file item produces an empty list
|
# Loading the dialog on a non-file item produces an empty list
|
||||||
nwSplit._loadContent(C.hNovelRoot)
|
nwSplit._loadContent(C.hNovelRoot)
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ from PyQt5.QtWidgets import QMessageBox, QMenu, QTreeWidgetItem, QDialog
|
|||||||
|
|
||||||
from novelwriter.enum import nwItemLayout, nwItemType, nwItemClass
|
from novelwriter.enum import nwItemLayout, nwItemType, nwItemClass
|
||||||
from novelwriter.core import NWDoc
|
from novelwriter.core import NWDoc
|
||||||
from novelwriter.dialogs import GuiEditLabel, GuiDocMerge
|
from novelwriter.dialogs import GuiEditLabel, GuiDocMerge, GuiDocSplit
|
||||||
from novelwriter.gui.projtree import GuiProjectTree
|
from novelwriter.gui.projtree import GuiProjectTree
|
||||||
|
|
||||||
|
|
||||||
@@ -675,7 +675,7 @@ def testGuiProjTree_ContextMenu(qtbot, monkeypatch, nwGUI, fncDir, mockRnd):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.gui
|
@pytest.mark.gui
|
||||||
def testGuiProjTree_MergeDocument(qtbot, monkeypatch, nwGUI, fncDir, mockRnd, ipsumText):
|
def testGuiProjTree_MergeDocuments(qtbot, monkeypatch, nwGUI, fncDir, mockRnd, ipsumText):
|
||||||
"""Test the merge document function.
|
"""Test the merge document function.
|
||||||
"""
|
"""
|
||||||
mergeData = {}
|
mergeData = {}
|
||||||
@@ -780,7 +780,122 @@ def testGuiProjTree_MergeDocument(qtbot, monkeypatch, nwGUI, fncDir, mockRnd, ip
|
|||||||
|
|
||||||
# qtbot.stop()
|
# qtbot.stop()
|
||||||
|
|
||||||
# END Test testGuiProjTree_MergeDocument
|
# END Test testGuiProjTree_MergeDocuments
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.gui
|
||||||
|
def testGuiProjTree_SplitDocument(qtbot, monkeypatch, nwGUI, fncDir, mockRnd, ipsumText):
|
||||||
|
"""Test the split document function.
|
||||||
|
"""
|
||||||
|
splitData = {}
|
||||||
|
splitText = []
|
||||||
|
|
||||||
|
# Block message box
|
||||||
|
monkeypatch.setattr(QMessageBox, "warning", lambda *a: QMessageBox.Yes)
|
||||||
|
monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Yes)
|
||||||
|
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
|
||||||
|
monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes)
|
||||||
|
|
||||||
|
monkeypatch.setattr(GuiDocSplit, "__init__", lambda *a: None)
|
||||||
|
monkeypatch.setattr(GuiDocSplit, "exec_", lambda *a: None)
|
||||||
|
monkeypatch.setattr(GuiDocSplit, "result", lambda *a: QDialog.Accepted)
|
||||||
|
monkeypatch.setattr(GuiDocSplit, "getData", lambda *a: (splitData, splitText))
|
||||||
|
|
||||||
|
# Create a project
|
||||||
|
prjDir = os.path.join(fncDir, "project")
|
||||||
|
buildTestProject(nwGUI, prjDir)
|
||||||
|
|
||||||
|
theProject = nwGUI.theProject
|
||||||
|
projTree = nwGUI.projView.projTree
|
||||||
|
|
||||||
|
docText = (
|
||||||
|
"Text\n\n"
|
||||||
|
"##! Prologue\n\nText\n\n"
|
||||||
|
"## Chapter One\n\nText\n\n"
|
||||||
|
"### Scene One\n\nText\n\n"
|
||||||
|
"### Scene Two\n\nText\n\n"
|
||||||
|
"## Chapter Two\n\nText\n\n"
|
||||||
|
"### Scene Three\n\nText\n\n"
|
||||||
|
"### Scene Four\n\nText\n\n"
|
||||||
|
"#! New Title\n\nText\n\n"
|
||||||
|
"## New Chapter\n\nText\n\n"
|
||||||
|
"### New Scene\n\nText\n\n"
|
||||||
|
"#### New Section\n\nText\n\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
hSplitDoc = theProject.newFile("Split Doc", C.hNovelRoot)
|
||||||
|
theProject.writeNewFile(hSplitDoc, 1, True, docText)
|
||||||
|
projTree.revealNewTreeItem(hSplitDoc, nHandle=C.hNovelRoot, wordCount=True)
|
||||||
|
|
||||||
|
docText = f"# Split Doc\n\n{docText}"
|
||||||
|
splitData["headerList"] = [
|
||||||
|
(0, 1, "Split Doc"),
|
||||||
|
(4, 2, "Prologue"),
|
||||||
|
(8, 2, "Chapter One"),
|
||||||
|
(12, 3, "Scene One"),
|
||||||
|
(16, 3, "Scene Two"),
|
||||||
|
(20, 2, "Chapter Two"),
|
||||||
|
(24, 3, "Scene Three"),
|
||||||
|
(28, 3, "Scene Four"),
|
||||||
|
(32, 1, "New Title"),
|
||||||
|
(36, 2, "New Chapter"),
|
||||||
|
(40, 3, "New Scene"),
|
||||||
|
(44, 4, "New Section"),
|
||||||
|
]
|
||||||
|
|
||||||
|
fstSet = [
|
||||||
|
"0000000000011", "0000000000012", "0000000000013", "0000000000014",
|
||||||
|
"0000000000015", "0000000000016", "0000000000017", "0000000000018",
|
||||||
|
"0000000000019", "000000000001a", "000000000001b", "000000000001c",
|
||||||
|
]
|
||||||
|
sndSet = [
|
||||||
|
"000000000001d", "000000000001e", "000000000001f", "0000000000020",
|
||||||
|
"0000000000021", "0000000000022", "0000000000023", "0000000000024",
|
||||||
|
"0000000000025", "0000000000026", "0000000000027", "0000000000028",
|
||||||
|
]
|
||||||
|
trdSet = [
|
||||||
|
"000000000002a", "000000000002b", "000000000002c", "000000000002d",
|
||||||
|
"000000000002e", "000000000002f", "0000000000030", "0000000000031",
|
||||||
|
"0000000000032", "0000000000033", "0000000000034", "0000000000035",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Try to split an invalid document and a non-document
|
||||||
|
assert projTree._splitDocument(C.hInvalid) is False
|
||||||
|
assert projTree._splitDocument(C.hNovelRoot) is False
|
||||||
|
|
||||||
|
# Split into same root folder
|
||||||
|
splitData["intoFolder"] = False
|
||||||
|
|
||||||
|
# Writing fails
|
||||||
|
with monkeypatch.context() as mp:
|
||||||
|
mp.setattr("builtins.open", causeOSError)
|
||||||
|
assert projTree._splitDocument(hSplitDoc) is True
|
||||||
|
for tHandle in fstSet:
|
||||||
|
assert tHandle in theProject.tree
|
||||||
|
assert not os.path.isfile(os.path.join(prjDir, "content", f"{tHandle}.nwd"))
|
||||||
|
|
||||||
|
# Writing succeeds
|
||||||
|
assert projTree._splitDocument(hSplitDoc) is True
|
||||||
|
for tHandle in sndSet:
|
||||||
|
assert tHandle in theProject.tree
|
||||||
|
assert os.path.isfile(os.path.join(prjDir, "content", f"{tHandle}.nwd"))
|
||||||
|
|
||||||
|
# Add to a folder
|
||||||
|
splitData["intoFolder"] = True
|
||||||
|
assert projTree._splitDocument(hSplitDoc) is True
|
||||||
|
assert "0000000000029" in theProject.tree # The folder
|
||||||
|
for tHandle in trdSet:
|
||||||
|
assert tHandle in theProject.tree
|
||||||
|
assert os.path.isfile(os.path.join(prjDir, "content", f"{tHandle}.nwd"))
|
||||||
|
|
||||||
|
# Cancelled by user
|
||||||
|
with monkeypatch.context() as mp:
|
||||||
|
mp.setattr(GuiDocSplit, "result", lambda *a: QDialog.Rejected)
|
||||||
|
assert projTree._splitDocument(hSplitDoc) is False
|
||||||
|
|
||||||
|
# qtbot.stop()
|
||||||
|
|
||||||
|
# END Test testGuiProjTree_SplitDocument
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.gui
|
@pytest.mark.gui
|
||||||
|
|||||||
Reference in New Issue
Block a user