Update tests
This commit is contained in:
@@ -29,11 +29,11 @@ import logging
|
|||||||
from time import time
|
from time import time
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from novelwriter.core.item import NWItem
|
|
||||||
|
|
||||||
from novelwriter.enum import nwItemLayout, nwItemClass
|
from novelwriter.enum import nwItemLayout, nwItemClass
|
||||||
from novelwriter.error import formatException
|
from novelwriter.error import formatException
|
||||||
from novelwriter.common import formatTimeStamp, isHandle
|
from novelwriter.common import formatTimeStamp, isHandle
|
||||||
|
from novelwriter.core.item import NWItem
|
||||||
|
|
||||||
if TYPE_CHECKING: # pragma: no cover
|
if TYPE_CHECKING: # pragma: no cover
|
||||||
from novelwriter.core.project import NWProject
|
from novelwriter.core.project import NWProject
|
||||||
@@ -199,9 +199,8 @@ class NWDocument:
|
|||||||
updatedDate = currTime
|
updatedDate = currTime
|
||||||
|
|
||||||
# DocMeta Line
|
# DocMeta Line
|
||||||
if self._item is None:
|
docMeta = ""
|
||||||
docMeta = ""
|
if self._item:
|
||||||
else:
|
|
||||||
docMeta = (
|
docMeta = (
|
||||||
f"%%~name: {self._item.itemName}\n"
|
f"%%~name: {self._item.itemName}\n"
|
||||||
f"%%~path: {self._item.itemParent}/{self._item.itemHandle}\n"
|
f"%%~path: {self._item.itemParent}/{self._item.itemHandle}\n"
|
||||||
@@ -328,7 +327,7 @@ class NWDocument:
|
|||||||
self._docMeta["updated"] = metaBits[1].strip()
|
self._docMeta["updated"] = metaBits[1].strip()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.debug("Ignoring meta data: '%s'", metaLine.strip())
|
logger.debug("Unknown meta data: '%s'", metaLine.strip())
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -226,8 +226,7 @@ def prjLipsum():
|
|||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def ipsumText():
|
def ipsumText():
|
||||||
"""Return five paragraphs of Lorem Ipsum text.
|
"""Return five paragraphs of Lorem Ipsum text."""
|
||||||
"""
|
|
||||||
thatIpsum = [(
|
thatIpsum = [(
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc maximus justo non dictum co"
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc maximus justo non dictum co"
|
||||||
"mmodo. Curabitur lacinia tempor orci vel luctus. Phasellus porta metus eu massa luctus, e"
|
"mmodo. Curabitur lacinia tempor orci vel luctus. Phasellus porta metus eu massa luctus, e"
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Ancient Europe
|
%%~name: Ancient Europe
|
||||||
%%~path: 60bdf227455cc/04468803b92e1
|
%%~path: 60bdf227455cc/04468803b92e1
|
||||||
%%~kind: WORLD/NOTE
|
%%~kind: WORLD/NOTE
|
||||||
|
%%~hash: b4318c2de40a1fc4055d18f8d02696b9cf171ea2
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
# Ancient Europe
|
# Ancient Europe
|
||||||
|
|
||||||
@tag: Europe
|
@tag: Europe
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Main
|
%%~name: Main
|
||||||
%%~path: 6c6afb1247750/2426c6f0ca922
|
%%~path: 6c6afb1247750/2426c6f0ca922
|
||||||
%%~kind: PLOT/NOTE
|
%%~kind: PLOT/NOTE
|
||||||
|
%%~hash: db3897d166e246acdb5e25e9bd98c5a40a699ed0
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
# Main Plot
|
# Main Plot
|
||||||
|
|
||||||
@tag: Main
|
@tag: Main
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Chapter Two
|
%%~name: Chapter Two
|
||||||
%%~path: 6bd935d2490cd/441420a886d82
|
%%~path: 6bd935d2490cd/441420a886d82
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: fd6d46708faa1333f8f7ba0442fc5b35bf1e3f85
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
## Chapter Two
|
## Chapter Two
|
||||||
|
|
||||||
@pov: Bod
|
@pov: Bod
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Scene Five
|
%%~name: Scene Five
|
||||||
%%~path: 6bd935d2490cd/47666c91c7ccf
|
%%~path: 6bd935d2490cd/47666c91c7ccf
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: d210c26966da6f9edea8726567abf4860b7bb9b7
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
### Scene Five
|
### Scene Five
|
||||||
|
|
||||||
@pov: Bod
|
@pov: Bod
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Mr. Nobody
|
%%~name: Mr. Nobody
|
||||||
%%~path: 67a8707f2f249/4c4f28287af27
|
%%~path: 67a8707f2f249/4c4f28287af27
|
||||||
%%~kind: CHARACTER/NOTE
|
%%~kind: CHARACTER/NOTE
|
||||||
|
%%~hash: 07a86c2001669de7d7a7545286c22b963e3ccf63
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
# Nobody Owens
|
# Nobody Owens
|
||||||
|
|
||||||
@tag: Bod
|
@tag: Bod
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Lorem Ipsum
|
%%~name: Lorem Ipsum
|
||||||
%%~path: b3643d0f92e32/7a992350f3eb6
|
%%~path: b3643d0f92e32/7a992350f3eb6
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: 8efda028000b70be0d7dbe9647b6026082ef05c9
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
#! Lorem Ipsum
|
#! Lorem Ipsum
|
||||||
|
|
||||||
>> **By lipsum.com** <<
|
>> **By lipsum.com** <<
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Interlude
|
%%~name: Interlude
|
||||||
%%~path: b3643d0f92e32/846352075de7d
|
%%~path: b3643d0f92e32/846352075de7d
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: ac0e16c65142b9f1e0fa281bdc9b954e44026740
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
##! Why do we use it?
|
##! Why do we use it?
|
||||||
|
|
||||||
% Exctracted from the lipsum.com website.
|
% Exctracted from the lipsum.com website.
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Scene One
|
%%~name: Scene One
|
||||||
%%~path: 45e6b01ca35c1/88243afbe5ed8
|
%%~path: 45e6b01ca35c1/88243afbe5ed8
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: a09245a7a772bbe02850b5db109977e336cd9cc1
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
### Scene One
|
### Scene One
|
||||||
|
|
||||||
@pov: Bod
|
@pov: Bod
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Prologue
|
%%~name: Prologue
|
||||||
%%~path: b3643d0f92e32/88d59a277361b
|
%%~path: b3643d0f92e32/88d59a277361b
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: 19a2aa95b07ce10eaea753c46569929439648c63
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
##! Prologue
|
##! Prologue
|
||||||
|
|
||||||
% Synopsis:Explanation from the lipsum.com website.
|
% Synopsis:Explanation from the lipsum.com website.
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Front Matter
|
%%~name: Front Matter
|
||||||
%%~path: b3643d0f92e32/8c58a65414c23
|
%%~path: b3643d0f92e32/8c58a65414c23
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: 5c3961cb7616ef2b378010f38a89ed268ef15d92
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
[NEW PAGE]
|
[NEW PAGE]
|
||||||
|
|
||||||
% Exctracted from the lipsum.com website.
|
% Exctracted from the lipsum.com website.
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Act One
|
%%~name: Act One
|
||||||
%%~path: b3643d0f92e32/db7e733775d4d
|
%%~path: b3643d0f92e32/db7e733775d4d
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: d93cd4c96d49e4afd93c82cca29d413a35012108
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
# Act One
|
# Act One
|
||||||
|
|
||||||
>> “Fusce maximus felis libero” <<
|
>> “Fusce maximus felis libero” <<
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Scene Three
|
%%~name: Scene Three
|
||||||
%%~path: 6bd935d2490cd/eb103bc70c90c
|
%%~path: 6bd935d2490cd/eb103bc70c90c
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: c4eda49e4fe81dc450d547eee0bdabe77fdaaa98
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
### Scene Three
|
### Scene Three
|
||||||
|
|
||||||
@pov: Bod
|
@pov: Bod
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Scene Four
|
%%~name: Scene Four
|
||||||
%%~path: 6bd935d2490cd/f8c0562e50f1b
|
%%~path: 6bd935d2490cd/f8c0562e50f1b
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: 9461a279b9fb6ef005ee4d432fcda77ff5bfbd42
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
### Scene Four
|
### Scene Four
|
||||||
|
|
||||||
@pov: Bod
|
@pov: Bod
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Scene Two
|
%%~name: Scene Two
|
||||||
%%~path: 45e6b01ca35c1/f96ec11c6a3da
|
%%~path: 45e6b01ca35c1/f96ec11c6a3da
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: ebe3fbaa16d9d81bc1a139822e3bf39bb357866d
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
### Scene Two
|
### Scene Two
|
||||||
|
|
||||||
@pov: Bod
|
@pov: Bod
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Chapter One
|
%%~name: Chapter One
|
||||||
%%~path: 45e6b01ca35c1/fb609cd8319dc
|
%%~path: 45e6b01ca35c1/fb609cd8319dc
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: 5dabeaa7a58238a6ad99ce73176b1bdfad1a71b7
|
||||||
|
%%~date: Unknown/Unknown
|
||||||
## Chapter One
|
## Chapter One
|
||||||
|
|
||||||
@pov: Bod
|
@pov: Bod
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.0.7" hexVersion="0x020007f0" fileVersion="1.5" fileRevision="1" timeStamp="2023-06-03 18:18:14">
|
<novelWriterXML appVersion="2.1-beta1" hexVersion="0x020100b1" fileVersion="1.5" fileRevision="1" timeStamp="2023-08-25 18:03:37">
|
||||||
<project id="5ac0df12-8b8b-476b-9905-21d33685687c" saveCount="42" autoCount="24" editTime="1913">
|
<project id="5ac0df12-8b8b-476b-9905-21d33685687c" saveCount="43" autoCount="24" editTime="1935">
|
||||||
<name>Lorem Ipsum</name>
|
<name>Lorem Ipsum</name>
|
||||||
<title>Lorem Ipsum</title>
|
<title>Lorem Ipsum</title>
|
||||||
<author>lipsum.com</author>
|
<author>lipsum.com</author>
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: Chapter 1
|
%%~name: Chapter 1
|
||||||
%%~path: 0000000000008/0000000000010
|
%%~path: 0000000000008/0000000000010
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: 25af8567c8a3b3b49a27dcda2999ed1f8811955a
|
||||||
|
%%~date: 2023-08-25 18:32:30/2023-08-25 18:32:30
|
||||||
## Chapter 1
|
## Chapter 1
|
||||||
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc maximus justo non dictum commodo. Curabitur lacinia tempor orci vel luctus. Phasellus porta metus eu massa luctus, eget euismod risus rhoncus. Vestibulum sed arcu nisi. Maecenas pretium facilisis velit, vel semper lacus aliquam sit amet. Vestibulum vulputate neque ligula, rhoncus blandit turpis consequat id. Mauris sagittis vehicula imperdiet. Duis sed nunc pretium, ornare purus vel, sodales augue. Maecenas a suscipit risus. Quisque volutpat justo eleifend est ullamcorper fermentum. Donec ullamcorper et tortor a laoreet. Nam id risus nisi. Vivamus non imperdiet erat, sit amet imperdiet felis. Mauris vitae neque et est aliquam scelerisque non non ipsum.
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc maximus justo non dictum commodo. Curabitur lacinia tempor orci vel luctus. Phasellus porta metus eu massa luctus, eget euismod risus rhoncus. Vestibulum sed arcu nisi. Maecenas pretium facilisis velit, vel semper lacus aliquam sit amet. Vestibulum vulputate neque ligula, rhoncus blandit turpis consequat id. Mauris sagittis vehicula imperdiet. Duis sed nunc pretium, ornare purus vel, sodales augue. Maecenas a suscipit risus. Quisque volutpat justo eleifend est ullamcorper fermentum. Donec ullamcorper et tortor a laoreet. Nam id risus nisi. Vivamus non imperdiet erat, sit amet imperdiet felis. Mauris vitae neque et est aliquam scelerisque non non ipsum.
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: All of Chapter 1
|
%%~name: All of Chapter 1
|
||||||
%%~path: 0000000000008/0000000000014
|
%%~path: 0000000000008/0000000000014
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: 9e632e7e29860572c685da8501b92bf99825ac3b
|
||||||
|
%%~date: 2023-08-25 18:29:39/2023-08-25 18:29:39
|
||||||
% Merge Novel Chapter: Chapter 1 [New]
|
% Merge Novel Chapter: Chapter 1 [New]
|
||||||
|
|
||||||
## Chapter 1
|
## Chapter 1
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: New Scene
|
%%~name: New Scene
|
||||||
%%~path: 000000000000d/000000000000f
|
%%~path: 000000000000d/000000000000f
|
||||||
%%~kind: NOVEL/DOCUMENT
|
%%~kind: NOVEL/DOCUMENT
|
||||||
|
%%~hash: fd5dc2f0c9767cb124b1bf2300d7a33b7780045e
|
||||||
|
%%~date: 2023-08-25 18:08:01/2023-08-25 18:08:04
|
||||||
# Novel
|
# Novel
|
||||||
|
|
||||||
## Chapter
|
## Chapter
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: New Note
|
%%~name: New Note
|
||||||
%%~path: 000000000000a/0000000000010
|
%%~path: 000000000000a/0000000000010
|
||||||
%%~kind: CHARACTER/NOTE
|
%%~kind: CHARACTER/NOTE
|
||||||
|
%%~hash: 9fae6dfdd3d1c0822d3a3cf90c0142e65ad8e557
|
||||||
|
%%~date: 2023-08-25 18:14:24/2023-08-25 18:14:24
|
||||||
# Jane Doe
|
# Jane Doe
|
||||||
|
|
||||||
@tag: Jane
|
@tag: Jane
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: New Note
|
%%~name: New Note
|
||||||
%%~path: 0000000000009/0000000000011
|
%%~path: 0000000000009/0000000000011
|
||||||
%%~kind: PLOT/NOTE
|
%%~kind: PLOT/NOTE
|
||||||
|
%%~hash: 8ff26f8a18ad6390c2ce725c441ab0c792a125cf
|
||||||
|
%%~date: 2023-08-25 18:15:35/2023-08-25 18:15:35
|
||||||
# Main Plot
|
# Main Plot
|
||||||
|
|
||||||
@tag: MainPlot
|
@tag: MainPlot
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
%%~name: New Note
|
%%~name: New Note
|
||||||
%%~path: 000000000000b/0000000000012
|
%%~path: 000000000000b/0000000000012
|
||||||
%%~kind: WORLD/NOTE
|
%%~kind: WORLD/NOTE
|
||||||
|
%%~hash: 3f5c3c6c3ba1c27c30b8ac9e59c222fb9a1bd775
|
||||||
|
%%~date: 2023-08-25 18:17:45/2023-08-25 18:17:45
|
||||||
# Main Location
|
# Main Location
|
||||||
|
|
||||||
@tag: Home
|
@tag: Home
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ from shutil import copyfile
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
|
|
||||||
|
from tools import C, NWD_IGNORE, buildTestProject, cmpFiles, XML_IGNORE
|
||||||
from mocked import causeOSError
|
from mocked import causeOSError
|
||||||
from tools import C, buildTestProject, cmpFiles, XML_IGNORE
|
|
||||||
|
|
||||||
from novelwriter import CONFIG
|
from novelwriter import CONFIG
|
||||||
from novelwriter.constants import nwItemClass
|
from novelwriter.constants import nwItemClass
|
||||||
@@ -46,19 +46,19 @@ def testCoreTools_DocMerger(monkeypatch, mockGUI, fncPath, tstPaths, mockRnd, ip
|
|||||||
# =====================
|
# =====================
|
||||||
|
|
||||||
hChapter1 = theProject.newFile("Chapter 1", C.hNovelRoot)
|
hChapter1 = theProject.newFile("Chapter 1", C.hNovelRoot)
|
||||||
hSceneOne11 = theProject.newFile("Scene 1.1", hChapter1)
|
hSceneOne11 = theProject.newFile("Scene 1.1", hChapter1) # type: ignore
|
||||||
hSceneOne12 = theProject.newFile("Scene 1.2", hChapter1)
|
hSceneOne12 = theProject.newFile("Scene 1.2", hChapter1) # type: ignore
|
||||||
hSceneOne13 = theProject.newFile("Scene 1.3", hChapter1)
|
hSceneOne13 = theProject.newFile("Scene 1.3", hChapter1) # type: ignore
|
||||||
|
|
||||||
docText1 = "\n\n".join(ipsumText[0:2]) + "\n\n"
|
docText1 = "\n\n".join(ipsumText[0:2]) + "\n\n"
|
||||||
docText2 = "\n\n".join(ipsumText[1:3]) + "\n\n"
|
docText2 = "\n\n".join(ipsumText[1:3]) + "\n\n"
|
||||||
docText3 = "\n\n".join(ipsumText[2:4]) + "\n\n"
|
docText3 = "\n\n".join(ipsumText[2:4]) + "\n\n"
|
||||||
docText4 = "\n\n".join(ipsumText[3:5]) + "\n\n"
|
docText4 = "\n\n".join(ipsumText[3:5]) + "\n\n"
|
||||||
|
|
||||||
theProject.writeNewFile(hChapter1, 2, True, docText1)
|
theProject.writeNewFile(hChapter1, 2, True, docText1) # type: ignore
|
||||||
theProject.writeNewFile(hSceneOne11, 3, True, docText2)
|
theProject.writeNewFile(hSceneOne11, 3, True, docText2) # type: ignore
|
||||||
theProject.writeNewFile(hSceneOne12, 3, True, docText3)
|
theProject.writeNewFile(hSceneOne12, 3, True, docText3) # type: ignore
|
||||||
theProject.writeNewFile(hSceneOne13, 3, True, docText4)
|
theProject.writeNewFile(hSceneOne13, 3, True, docText4) # type: ignore
|
||||||
|
|
||||||
# Basic Checks
|
# Basic Checks
|
||||||
# ============
|
# ============
|
||||||
@@ -81,12 +81,12 @@ def testCoreTools_DocMerger(monkeypatch, mockGUI, fncPath, tstPaths, mockRnd, ip
|
|||||||
testFile = tstPaths.outDir / "coreDocTools_DocMerger_0000000000014.nwd"
|
testFile = tstPaths.outDir / "coreDocTools_DocMerger_0000000000014.nwd"
|
||||||
compFile = tstPaths.refDir / "coreDocTools_DocMerger_0000000000014.nwd"
|
compFile = tstPaths.refDir / "coreDocTools_DocMerger_0000000000014.nwd"
|
||||||
|
|
||||||
assert docMerger.newTargetDoc(hChapter1, "All of Chapter 1") == "0000000000014"
|
assert docMerger.newTargetDoc(hChapter1, "All of Chapter 1") == "0000000000014" # type: ignore
|
||||||
|
|
||||||
assert docMerger.appendText(hChapter1, True, "Merge") is True
|
assert docMerger.appendText(hChapter1, True, "Merge") is True # type: ignore
|
||||||
assert docMerger.appendText(hSceneOne11, True, "Merge") is True
|
assert docMerger.appendText(hSceneOne11, True, "Merge") is True # type: ignore
|
||||||
assert docMerger.appendText(hSceneOne12, True, "Merge") is True
|
assert docMerger.appendText(hSceneOne12, True, "Merge") is True # type: ignore
|
||||||
assert docMerger.appendText(hSceneOne13, True, "Merge") is True
|
assert docMerger.appendText(hSceneOne13, True, "Merge") is True # type: ignore
|
||||||
|
|
||||||
# Block writing and check error handling
|
# Block writing and check error handling
|
||||||
with monkeypatch.context() as mp:
|
with monkeypatch.context() as mp:
|
||||||
@@ -98,7 +98,7 @@ def testCoreTools_DocMerger(monkeypatch, mockGUI, fncPath, tstPaths, mockRnd, ip
|
|||||||
# Write properly, and compare
|
# Write properly, and compare
|
||||||
assert docMerger.writeTargetDoc() is True
|
assert docMerger.writeTargetDoc() is True
|
||||||
copyfile(saveFile, testFile)
|
copyfile(saveFile, testFile)
|
||||||
assert cmpFiles(testFile, compFile)
|
assert cmpFiles(testFile, compFile, ignoreStart=NWD_IGNORE)
|
||||||
|
|
||||||
# Merge into Existing
|
# Merge into Existing
|
||||||
# ===================
|
# ===================
|
||||||
@@ -107,15 +107,15 @@ def testCoreTools_DocMerger(monkeypatch, mockGUI, fncPath, tstPaths, mockRnd, ip
|
|||||||
testFile = tstPaths.outDir / "coreDocTools_DocMerger_0000000000010.nwd"
|
testFile = tstPaths.outDir / "coreDocTools_DocMerger_0000000000010.nwd"
|
||||||
compFile = tstPaths.refDir / "coreDocTools_DocMerger_0000000000010.nwd"
|
compFile = tstPaths.refDir / "coreDocTools_DocMerger_0000000000010.nwd"
|
||||||
|
|
||||||
docMerger.setTargetDoc(hChapter1)
|
docMerger.setTargetDoc(hChapter1) # type: ignore
|
||||||
|
|
||||||
assert docMerger.appendText(hSceneOne11, True, "Merge") is True
|
assert docMerger.appendText(hSceneOne11, True, "Merge") is True # type: ignore
|
||||||
assert docMerger.appendText(hSceneOne12, True, "Merge") is True
|
assert docMerger.appendText(hSceneOne12, True, "Merge") is True # type: ignore
|
||||||
assert docMerger.appendText(hSceneOne13, True, "Merge") is True
|
assert docMerger.appendText(hSceneOne13, True, "Merge") is True # type: ignore
|
||||||
|
|
||||||
assert docMerger.writeTargetDoc() is True
|
assert docMerger.writeTargetDoc() is True
|
||||||
copyfile(saveFile, testFile)
|
copyfile(saveFile, testFile)
|
||||||
assert cmpFiles(testFile, compFile)
|
assert cmpFiles(testFile, compFile, ignoreStart=NWD_IGNORE)
|
||||||
|
|
||||||
# Just for debugging
|
# Just for debugging
|
||||||
docMerger.writeTargetDoc()
|
docMerger.writeTargetDoc()
|
||||||
@@ -163,11 +163,11 @@ def testCoreTools_DocSplitter(monkeypatch, mockGUI, fncPath, mockRnd, ipsumText)
|
|||||||
docText = "\n\n".join(docData)
|
docText = "\n\n".join(docData)
|
||||||
docRaw = docText.splitlines()
|
docRaw = docText.splitlines()
|
||||||
assert theProject.storage.getDocument(hSplitDoc).writeDocument(docText) is True
|
assert theProject.storage.getDocument(hSplitDoc).writeDocument(docText) is True
|
||||||
theProject.tree[hSplitDoc].setStatus(C.sFinished)
|
theProject.tree[hSplitDoc].setStatus(C.sFinished) # type: ignore
|
||||||
theProject.tree[hSplitDoc].setImport(C.iMain)
|
theProject.tree[hSplitDoc].setImport(C.iMain) # type: ignore
|
||||||
|
|
||||||
docSplitter = DocSplitter(theProject, hSplitDoc)
|
docSplitter = DocSplitter(theProject, hSplitDoc) # type: ignore
|
||||||
assert docSplitter._srcItem.isFileType()
|
assert docSplitter._srcItem.isFileType() # type: ignore
|
||||||
assert docSplitter.getError() == ""
|
assert docSplitter.getError() == ""
|
||||||
|
|
||||||
# Run the split algorithm
|
# Run the split algorithm
|
||||||
@@ -247,8 +247,8 @@ def testCoreTools_DocSplitter(monkeypatch, mockGUI, fncPath, mockRnd, ipsumText)
|
|||||||
|
|
||||||
# Check that status and importance has been preserved
|
# Check that status and importance has been preserved
|
||||||
for rHandle in resDocHandle:
|
for rHandle in resDocHandle:
|
||||||
assert theProject.tree[rHandle].itemStatus == C.sFinished
|
assert theProject.tree[rHandle].itemStatus == C.sFinished # type: ignore
|
||||||
assert theProject.tree[rHandle].itemImport == C.iMain
|
assert theProject.tree[rHandle].itemImport == C.iMain # type: ignore
|
||||||
|
|
||||||
# Check handling of improper initialisation
|
# Check handling of improper initialisation
|
||||||
docSplitter = DocSplitter(theProject, C.hInvalid)
|
docSplitter = DocSplitter(theProject, C.hInvalid)
|
||||||
@@ -416,7 +416,7 @@ def testCoreTools_NewMinimal(monkeypatch, fncPath, tstPaths, mockGUI, mockRnd):
|
|||||||
assert projBuild.buildProject({}) is False
|
assert projBuild.buildProject({}) is False
|
||||||
|
|
||||||
# Wrong type should also fail
|
# Wrong type should also fail
|
||||||
assert projBuild.buildProject("stuff") is False
|
assert projBuild.buildProject("stuff") is False # type: ignore
|
||||||
|
|
||||||
# Try again with a proper path
|
# Try again with a proper path
|
||||||
assert projBuild.buildProject({"projPath": fncPath}) is True
|
assert projBuild.buildProject({"projPath": fncPath}) is True
|
||||||
@@ -508,7 +508,7 @@ def testCoreTools_NewCustomB(monkeypatch, fncPath, tstPaths, mockRnd):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.core
|
@pytest.mark.core
|
||||||
def testCoreTools_NewSample(monkeypatch, fncPath, tstPaths):
|
def testCoreTools_NewSample(monkeypatch, mockGUI, fncPath, tstPaths):
|
||||||
"""Check that we can create a new project can be created from the
|
"""Check that we can create a new project can be created from the
|
||||||
provided sample project via a zip file.
|
provided sample project via a zip file.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from tools import C, MOCK_TIME, buildTestProject, readFile, writeFile
|
||||||
from mocked import causeOSError
|
from mocked import causeOSError
|
||||||
from tools import C, buildTestProject, readFile, writeFile
|
|
||||||
|
|
||||||
from novelwriter.enum import nwItemClass, nwItemLayout
|
from novelwriter.enum import nwItemClass, nwItemLayout
|
||||||
from novelwriter.core.project import NWProject
|
from novelwriter.core.project import NWProject
|
||||||
@@ -32,6 +32,8 @@ from novelwriter.core.document import NWDocument
|
|||||||
@pytest.mark.core
|
@pytest.mark.core
|
||||||
def testCoreDocument_LoadSave(monkeypatch, mockGUI, fncPath, mockRnd):
|
def testCoreDocument_LoadSave(monkeypatch, mockGUI, fncPath, mockRnd):
|
||||||
"""Test loading and saving a document with the NWDocument class."""
|
"""Test loading and saving a document with the NWDocument class."""
|
||||||
|
monkeypatch.setattr("novelwriter.core.document.time", lambda: MOCK_TIME)
|
||||||
|
|
||||||
theProject = NWProject()
|
theProject = NWProject()
|
||||||
mockRnd.reset()
|
mockRnd.reset()
|
||||||
buildTestProject(theProject, fncPath)
|
buildTestProject(theProject, fncPath)
|
||||||
@@ -48,7 +50,7 @@ def testCoreDocument_LoadSave(monkeypatch, mockGUI, fncPath, mockRnd):
|
|||||||
# Non-existent handle
|
# Non-existent handle
|
||||||
theDoc = NWDocument(theProject, C.hInvalid)
|
theDoc = NWDocument(theProject, C.hInvalid)
|
||||||
assert theDoc.readDocument() is None
|
assert theDoc.readDocument() is None
|
||||||
assert theDoc._currHash is None
|
assert theDoc._lastHash == ""
|
||||||
assert theDoc.fileExists() is False
|
assert theDoc.fileExists() is False
|
||||||
|
|
||||||
# No content path
|
# No content path
|
||||||
@@ -90,7 +92,7 @@ def testCoreDocument_LoadSave(monkeypatch, mockGUI, fncPath, mockRnd):
|
|||||||
# Set handle and save
|
# Set handle and save
|
||||||
theText = "### Test File\n\nText ...\n\n"
|
theText = "### Test File\n\nText ...\n\n"
|
||||||
theDoc = NWDocument(theProject, xHandle)
|
theDoc = NWDocument(theProject, xHandle)
|
||||||
assert theDoc.readDocument(xHandle) == ""
|
assert theDoc.readDocument(xHandle) == "" # type: ignore
|
||||||
assert theDoc.writeDocument(theText) is True
|
assert theDoc.writeDocument(theText) is True
|
||||||
|
|
||||||
# Save again to ensure temp file and previous file is handled
|
# Save again to ensure temp file and previous file is handled
|
||||||
@@ -102,6 +104,8 @@ def testCoreDocument_LoadSave(monkeypatch, mockGUI, fncPath, mockRnd):
|
|||||||
"%%~name: New File\n"
|
"%%~name: New File\n"
|
||||||
f"%%~path: {C.hNovelRoot}/{xHandle}\n"
|
f"%%~path: {C.hNovelRoot}/{xHandle}\n"
|
||||||
"%%~kind: NOVEL/DOCUMENT\n"
|
"%%~kind: NOVEL/DOCUMENT\n"
|
||||||
|
"%%~hash: b288c3ab03181027d9a16d7fd2291262f5de9ac8\n"
|
||||||
|
"%%~date: 2019-05-10 18:52:00/2019-05-10 18:52:00\n"
|
||||||
"### Test File\n\n"
|
"### Test File\n\n"
|
||||||
"Text ...\n\n"
|
"Text ...\n\n"
|
||||||
)
|
)
|
||||||
@@ -170,9 +174,10 @@ def testCoreDocument_LoadSave(monkeypatch, mockGUI, fncPath, mockRnd):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.core
|
@pytest.mark.core
|
||||||
def testCoreDocument_Methods(mockGUI, fncPath, mockRnd):
|
def testCoreDocument_Methods(monkeypatch, mockGUI, fncPath, mockRnd):
|
||||||
"""Test other methods of the NWDocument class.
|
"""Test other methods of the NWDocument class."""
|
||||||
"""
|
monkeypatch.setattr("novelwriter.core.document.time", lambda: MOCK_TIME)
|
||||||
|
|
||||||
theProject = NWProject()
|
theProject = NWProject()
|
||||||
mockRnd.reset()
|
mockRnd.reset()
|
||||||
buildTestProject(theProject, fncPath)
|
buildTestProject(theProject, fncPath)
|
||||||
@@ -187,7 +192,7 @@ def testCoreDocument_Methods(mockGUI, fncPath, mockRnd):
|
|||||||
|
|
||||||
# Check the item
|
# Check the item
|
||||||
assert theDoc.getCurrentItem() is not None
|
assert theDoc.getCurrentItem() is not None
|
||||||
assert theDoc.getCurrentItem().itemHandle == C.hSceneDoc
|
assert theDoc.getCurrentItem().itemHandle == C.hSceneDoc # type: ignore
|
||||||
|
|
||||||
# Check the meta
|
# Check the meta
|
||||||
theName, theParent, theClass, theLayout = theDoc.getMeta()
|
theName, theParent, theClass, theLayout = theDoc.getMeta()
|
||||||
@@ -202,6 +207,8 @@ def testCoreDocument_Methods(mockGUI, fncPath, mockRnd):
|
|||||||
"%%~name: New Scene\n"
|
"%%~name: New Scene\n"
|
||||||
f"%%~path: {C.hChapterDir}/{C.hSceneDoc}\n"
|
f"%%~path: {C.hChapterDir}/{C.hSceneDoc}\n"
|
||||||
"%%~kind: NOVEL/DOCUMENT\n"
|
"%%~kind: NOVEL/DOCUMENT\n"
|
||||||
|
"%%~hash: dd350c602de803554b2a7c17f191ae25dea1df63\n"
|
||||||
|
"%%~date: 2019-05-10 18:52:00/2019-05-10 18:52:00\n"
|
||||||
"%%~ stuff\n"
|
"%%~ stuff\n"
|
||||||
"### Test File\n\n"
|
"### Test File\n\n"
|
||||||
"Text ...\n\n"
|
"Text ...\n\n"
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import pytest
|
|||||||
from shutil import copyfile
|
from shutil import copyfile
|
||||||
|
|
||||||
from tools import (
|
from tools import (
|
||||||
C, cmpFiles, buildTestProject, XML_IGNORE, getGuiItem, writeFile
|
C, NWD_IGNORE, cmpFiles, buildTestProject, XML_IGNORE, getGuiItem, writeFile
|
||||||
)
|
)
|
||||||
|
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
@@ -529,25 +529,25 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, projPath, tstPaths, mockRnd):
|
|||||||
testFile = tstPaths.outDir / "guiEditor_Main_Final_000000000000f.nwd"
|
testFile = tstPaths.outDir / "guiEditor_Main_Final_000000000000f.nwd"
|
||||||
compFile = tstPaths.refDir / "guiEditor_Main_Final_000000000000f.nwd"
|
compFile = tstPaths.refDir / "guiEditor_Main_Final_000000000000f.nwd"
|
||||||
copyfile(projFile, testFile)
|
copyfile(projFile, testFile)
|
||||||
assert cmpFiles(testFile, compFile)
|
assert cmpFiles(testFile, compFile, ignoreStart=NWD_IGNORE)
|
||||||
|
|
||||||
projFile = projPath / "content" / "0000000000010.nwd"
|
projFile = projPath / "content" / "0000000000010.nwd"
|
||||||
testFile = tstPaths.outDir / "guiEditor_Main_Final_0000000000010.nwd"
|
testFile = tstPaths.outDir / "guiEditor_Main_Final_0000000000010.nwd"
|
||||||
compFile = tstPaths.refDir / "guiEditor_Main_Final_0000000000010.nwd"
|
compFile = tstPaths.refDir / "guiEditor_Main_Final_0000000000010.nwd"
|
||||||
copyfile(projFile, testFile)
|
copyfile(projFile, testFile)
|
||||||
assert cmpFiles(testFile, compFile)
|
assert cmpFiles(testFile, compFile, ignoreStart=NWD_IGNORE)
|
||||||
|
|
||||||
projFile = projPath / "content" / "0000000000011.nwd"
|
projFile = projPath / "content" / "0000000000011.nwd"
|
||||||
testFile = tstPaths.outDir / "guiEditor_Main_Final_0000000000011.nwd"
|
testFile = tstPaths.outDir / "guiEditor_Main_Final_0000000000011.nwd"
|
||||||
compFile = tstPaths.refDir / "guiEditor_Main_Final_0000000000011.nwd"
|
compFile = tstPaths.refDir / "guiEditor_Main_Final_0000000000011.nwd"
|
||||||
copyfile(projFile, testFile)
|
copyfile(projFile, testFile)
|
||||||
assert cmpFiles(testFile, compFile)
|
assert cmpFiles(testFile, compFile, ignoreStart=NWD_IGNORE)
|
||||||
|
|
||||||
projFile = projPath / "content" / "0000000000012.nwd"
|
projFile = projPath / "content" / "0000000000012.nwd"
|
||||||
testFile = tstPaths.outDir / "guiEditor_Main_Final_0000000000012.nwd"
|
testFile = tstPaths.outDir / "guiEditor_Main_Final_0000000000012.nwd"
|
||||||
compFile = tstPaths.refDir / "guiEditor_Main_Final_0000000000012.nwd"
|
compFile = tstPaths.refDir / "guiEditor_Main_Final_0000000000012.nwd"
|
||||||
copyfile(projFile, testFile)
|
copyfile(projFile, testFile)
|
||||||
assert cmpFiles(testFile, compFile)
|
assert cmpFiles(testFile, compFile, ignoreStart=NWD_IGNORE)
|
||||||
|
|
||||||
# qtbot.stop()
|
# qtbot.stop()
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -23,11 +23,14 @@ from __future__ import annotations
|
|||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
from PyQt5.QtWidgets import qApp
|
from PyQt5.QtWidgets import qApp
|
||||||
|
|
||||||
XML_IGNORE = ("<novelWriterXML", "<project")
|
XML_IGNORE = ("<novelWriterXML", "<project")
|
||||||
ODT_IGNORE = ("<meta:generator", "<meta:creation-date", "<dc:date", "<meta:editing")
|
ODT_IGNORE = ("<meta:generator", "<meta:creation-date", "<dc:date", "<meta:editing")
|
||||||
|
NWD_IGNORE = ("%%~date:",)
|
||||||
|
MOCK_TIME = datetime(2019, 5, 10, 18, 52, 0).timestamp()
|
||||||
|
|
||||||
|
|
||||||
class C:
|
class C:
|
||||||
@@ -62,8 +65,7 @@ def cmpFiles(
|
|||||||
ignoreLines: list | None = None,
|
ignoreLines: list | None = None,
|
||||||
ignoreStart: tuple | None = None
|
ignoreStart: tuple | None = None
|
||||||
) -> bool:
|
) -> bool:
|
||||||
"""Compare two files, but optionally ignore lines given by a list.
|
"""Compare two files, with optional line ignore."""
|
||||||
"""
|
|
||||||
if ignoreLines is None:
|
if ignoreLines is None:
|
||||||
ignoreLines = []
|
ignoreLines = []
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user